使用for循环重命名列会产生错误,R

时间:2018-01-29 16:44:49

标签: r for-loop rename

我已经获得了一个稍微不一致且杂乱的变量名称的数据集。我想以高效自动的方式重命名它们。

我有一组数据框,我需要在其中几个中重命名一些列。列的顺序和数据帧的长度不同,因此我想使用任何函数,如grep()或子集项(df$x[== "term"])。

我发现了一个关于此问题的较早问题(Rename columns in multiple dataframes, R),但由于收到错误消息,我无法获得任何建议的解决方案。我的声誉不足以发表评论,并就这些答复提出进一步的问题。但是,我的问题似乎有点不同,因为我从前面的问题中没有提到的for循环中收到错误消息:

Error in `colnames<-`(`*tmp*`, value = character(0)) : 
  attempt to set 'colnames' on an object with less than two dimensions

设置:多个数据框,我们称之为myDF1myDF2 ... 在这些数据框中,有一些名称(bad_name1bad_name2)的列应更改为其他内容(good_name1good_name2)。

可复制数据集:

myDF1 <- data.frame(bad_name1="A", bad_name2="B")
myDF2 <- data.frame(bad_name1="C", bad_name2="D")

for (x in c(myDF1,myDF2)) {
colnames(x) <- gsub(x = colnames(x), pattern = "bad_name0", replacement = "good_name1")
}

有几种方法可以做到这一点。一个吸引我的是子集方法:

colnames(myDF1)[names(myDF1) == "bad_name1"] <- "good_name1")

这可以作为单行工作,但不能作为for循环。

for (x in c(myDF1,myDF2)) {
colnames(x)[colnames(x) == "bad_name1"] <- "good_name1"
}

这会呈现错误消息。

Error in `colnames<-`(`*tmp*`, value = character(0)) : 
  attempt to set 'colnames' on an object with less than two dimensions

相同的错误消息适用于基于'gsub'的方法:

for (x in c(myDF1,myDF2)) {
colnames(x) <- gsub(x = colnames(x), pattern = "bad_name1", replacement = "good_name1")
}

我意识到我错过了一些基本的东西。我想for循环没有以适当的格式接收'colnames(x)'的结果。但我无法理解我应该如何让它发挥作用。 Rename columns in multiple dataframes, R中建议的方法并未真正涵盖此错误消息。

vaettchen在评论中提出的补充说明:
有3个列名称必须更改(在所有数据框中)。原因是它们的名称类似于varX.1varX.2varX.3,而我更喜欢varXcountvarXmeanvarXmax。所以我意识到有一些我不满意的名字,并根据自己的口味决定新的名称。

1 个答案:

答案 0 :(得分:1)

你只需要做一些小改动。查看c(myDF1, myDF2)以了解为什么不起作用 - 它将数据框拆分为4个因子的列表。将数据框组合到一个列表中并处理列表:

all <- list(myDF1=myDF1, myDF2=myDF2)
for (x in seq_along(all)) {
colnames(all[[x]]) <- gsub(x = colnames(all[[x]]), pattern = "bad_name1",
    replacement = "good_name1")
}
list2env(all, envir=.GlobalEnv)