考虑到简单的代码,
df <- data.frame(x = 1:2,
y = 3:4,
z = 5:6)
如何使用
x
重命名一行列 z
和 colnames()
?
我知道
colnames(df)[1:2] <- c("p", "q")
会修改前两个标题,但我如何重命名不在一起的列?
我知道可以完成这项工作的不同命令,只是想知道是否有
colnames()
解决方案。
而不是选择第 1 列和第 2 列的
1:2
,您可以将 c(1,3)
用于第 1 列和第 3 列。此外,我会使用 names
代替 data.frame
而不是 colnames
但 colnames
会也工作。
names(df)[c(1,3)] <- c("p", "q")
如果位置未知,但名称未知,您可以使用
match
获取所需的列。
names(df)[match(c("x", "z"), names(df))] <- c("p", "q")
或者更强大的版本,以防找不到匹配项。
i <- c(x = "p", z = "q")[names(df)]
j <- !is.na(i)
names(df)[j] <- i[j]
或者不使用中间步骤的变体。
names(df) <- c(x = "p", z = "q", setNames(names(df), names(df)))[names(df)]
names(df) <- (\(.) c(x = "p", z = "q", setNames(., .))[.])(names(df)) #Variant
还看看按名称重命名多个列和Canonical tidyverse method to update some values of a vector from a look-up table.
注意:在
colnames<-
的源代码中,您可以找到以下几行:
if (is.data.frame(x)) {
names(x) <- value
}
所以当我有
names
时,我更喜欢使用colnames
而不是data.frame
。