用R中定义的向量替换行名称

ktecyv1j  于 2023-03-27  发布在  其他
关注(0)|答案(4)|浏览(195)

有没有一种方法可以根据R中预定义的向量来替换行名称,比如:
rownames(GV)〈- c(beta1='Age',beta10='Female Gender')

ct2axkht

ct2axkht1#

或者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)行)-对于其余情况,我保留上面的前一行名称。

1dkrff03

1dkrff032#

如果你想重命名所有行,并且你有一个所需新名称的数组按顺序

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的第一个建议可能更容易。

pvabu6sv

pvabu6sv3#

我们可以采取以下措施:

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在评论中提到的,这是一个警告:无论名称在%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

创建于2021-12-21由reprex package(v2.0.1)

k3bvogb1

k3bvogb14#

最安全的方法,也是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

相关问题