我已经获得了一个稍微不一致且杂乱的变量名称的数据集。我想以高效自动的方式重命名它们。
我有一组数据框,我需要在其中几个中重命名一些列。列的顺序和数据帧的长度不同,因此我想使用任何函数,如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
设置:多个数据框,我们称之为myDF1
,myDF2
...
在这些数据框中,有一些名称(bad_name1
,bad_name2
)的列应更改为其他内容(good_name1
,good_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.1
,varX.2
,varX.3
,而我更喜欢varXcount
,varXmean
,varXmax
。所以我意识到有一些我不满意的名字,并根据自己的口味决定新的名称。
答案 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)