用R中定义的向量替换行名
Posted
技术标签:
【中文标题】用R中定义的向量替换行名【英文标题】:replace row names with defined vector in R 【发布时间】:2022-01-22 21:38:28 【问题描述】:有没有一种方法可以根据 R 中的预定义向量替换行名,例如:
rownames(GV)
【问题讨论】:
你在找这个吗? stat.ethz.ch/R-manual/R-devel/library/base/html/row.names.html 它建议你使用 row.names(GV) 【参考方案1】:或者case_when()
对你来说会更容易:
library(dplyr)
df <- data.frame(a = c(1, 2, 3))
rownames(df)
#> [1] "1" "2" "3"
rownames(df) <- case_when(rownames(df) == "1" ~ "one",
rownames(df) == "2" ~ "two",
TRUE ~ rownames(df))
rownames(df)
#> [1] "one" "two" "3"
您为每个条件指定新值,并为所有剩余情况指定值(TRUE ~ rownames(df)
行) - 对于剩余情况,我将在上面保留之前的行名。
【讨论】:
【参考方案2】:我们可以这样做:
rownames(mtcars)[which(rownames(mtcars) == "Datsun 710")] <- "My Rowname"
head(mtcars)
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#> Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#> My Rowname 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#> Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#> Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
#> Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
如果我们想重命名更多rownames
,我们可以使用%in%
,但正如@gss 在cmets 中提到的,这有一个警告:无论%in%
之后的字符向量中名称的顺序如何名称将按照它们在rownames()
中出现的顺序被替换。比较以下两个调用:
rownames(mtcars)[which(rownames(mtcars) %in% c("Datsun 710", "Mazda RX4 Wag"))] <- c("My Rowname1","My Rowname2")
head(mtcars)
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#> My Rowname1 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#> My Rowname2 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#> Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#> Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
#> Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
与以下结果相同:
rownames(mtcars)[which(rownames(mtcars) %in% c("Mazda RX4 Wag", "Datsun 710"))] <- c("My Rowname1","My Rowname2")
head(mtcars)
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#> My Rowname1 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#> My Rowname2 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#> Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#> Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
#> Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
由reprex package (v2.0.1) 于 2021 年 12 月 21 日创建
【讨论】:
你确定这个例子是%in%
吗?用户可能期望“Datsun 710”将被“My Rowname1”取代,但事实并非如此。我的意思是 - 在你的情况下使用 %in%
意味着用户必须知道对象中名称的顺序是什么才能用他/她选择的名称替换。
@gss:好地方,这确实是我在回答中添加的一个警告。使用 dplyr 时,您的 case_when
方法更简洁。【参考方案3】:
如果您想重命名所有行,并且您有一个所需的新名称数组按顺序:
example <- head(mtcars, 3)
mynewnames <- c("First", "Second", "Third")
rownames(example) <- mynewnames
example
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> First 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#> Second 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#> Third 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
如果你想重命名所有行,并且你有一个命名数组(不一定是正确的顺序):
example <- head(mtcars, 3)
mynewnames <- c("Datsun 710" = "Datsun", "Mazda RX4" = "Mazda", "Mazda RX4 Wag" = "Also Mazda")
rownames(example) <- mynewnames[rownames(example)]
example
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> Mazda 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#> Also Mazda 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#> Datsun 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
如果你想重命名只有一些行,并有一个命名数组(有序数组在这种情况下没有意义):
example <- head(mtcars, 3)
mynewnames <- c("Mazda RX4" = "This Mazda", "Mazda RX4 Wag" = "That Mazda")
rownames(example)[rownames(example) %in% names(mynewnames)] <-
mynewnames[rownames(example)[rownames(example) %in% names(mynewnames)]]
example
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> This Mazda 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#> That Mazda 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#> Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
这有点笨拙;如果您只替换一个或两个行名,那么@TimTeaFan 的第一个建议可能更容易。
【讨论】:
【参考方案4】:最安全的方式和 OP 更喜欢使用预定义的命名向量是采用当前行名,替换那些已定义的行名并再次设置行名。这不会在不完整的向量上失败,如果它不能被替换,它会保持原来的状态。
此解决方案的优点是如果您的重命名向量不完整,可以防止出现以下错误。
Error in `.rowNamesDF<-`(x, value = value) :
missing values in 'row.names' are not allowed
解决方案
library(stringr) # used for str_replace_all()
df <- data.frame(
x = rep(1:5),
y = rep(11:15),
row.names = LETTERS[1:5]
)
df
# x y
# A 1 11
# B 2 12
# C 3 13
# D 4 14
# E 5 15
change <- c("A" = "a", "C" = "c")
row.names(df) <- str_replace_all(row.names(df), change)
df
# x y
# a 1 11
# B 2 12
# c 3 13
# D 4 14
# E 5 15
【讨论】:
以上是关于用R中定义的向量替换行名的主要内容,如果未能解决你的问题,请参考以下文章