使用字符串值选择数据框并更改其列名

时间:2018-05-07 08:07:54

标签: r string dataframe

我正在尝试更改数据框中的列名。我想使用字符串值和eval(as.name(paste()))一起选择数据框。

这是我的代码:

list <-c("a","b","c","d")

for (i in 1: length(list) )
{
assign(paste("tf_", list[i], "_0", sep=""), as.data.frame( ifelse ( !is.na( Data[[list[i]]] ),1,0 ) ) )

names(eval(as.name(paste("tf_", list[i], "_0", sep=""))))<-"blablabla"

}

当我使用部件names(eval(as.name(paste("tf_", list[i], "_0", sep=""))))时,它会返回预期的名称,但是当我想指定一个不同的名称字符串值时,它会向我显示错误: 赋值目标扩展为非 - 语言对象

1 个答案:

答案 0 :(得分:0)

我会这样做。

示例数据:

df1 <- data.frame(a = rnorm(10), b = rnorm(10), x = rnorm(10))
df2 <- data.frame(a = rnorm(10), c = rnorm(10), y = rnorm(10))
df3 <- data.frame(b = rnorm(10), d = rnorm(10), z = rnorm(10))

首先使用mget()将数据框放入列表中。

test <- mget(paste0("df", 1:3))

现有名称:

> sapply(test, names)
     df1 df2 df3
[1,] "a" "a" "b"
[2,] "b" "c" "d"
[3,] "x" "y" "z"

然后创建替代名称的向量:

dud <- c(a = "n1", b = "n2", c = "n3", d = "n4")

然后遍历列表以更改所有数据框中的相关列名:

for(i in 1:length(test)){
  names(test[[i]])[names(test[[i]]) %in% names(dud)] <- dud[names(dud) %in% names(test[[i]])]
}

新名称:

> sapply(test, names)
     df1  df2  df3 
[1,] "n1" "n1" "n2"
[2,] "n2" "n3" "n4"
[3,] "x"  "y"  "z"