首页 > 解决方案 > 使用字符串值选择数据框并更改其列名

问题描述

我正在尝试更改数据框中的列名。我想结合使用字符串值来选择数据框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"

}

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

标签: rstringdataframe

解决方案


我会这样做。

示例数据:

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" 

推荐阅读