【问题标题】:In R, change select column names within select data frames in a list在 R 中,更改列表中选择数据框中的选择列名称
【发布时间】:2014-04-15 17:11:52
【问题描述】:

我有一个包含 21 个非常大的数据框的列表。对于其中 11 个数据框,我想更改最后 5 列的名称。

这是一些示例代码,显示了与我的数据相同的基本结构。

x<-data.frame(matrix(data=rep("2",12),ncol=6))
y<-data.frame(matrix(data=rep("3",12),ncol=6))
z<-data.frame(matrix(data=rep("4",12),ncol=6))
a<-list(x,y,z)

> a
[[1]]
  X1 X2 X3 X4 X5 X6
1  2  2  2  2  2  2
2  2  2  2  2  2  2

[[2]]
  X1 X2 X3 X4 X5 X6
1  3  3  3  3  3  3
2  3  3  3  3  3  3

[[3]]
  X1 X2 X3 X4 X5 X6
1  4  4  4  4  4  4
2  4  4  4  4  4  4

这是我想要的输出:

>a
[[1]]
  X1 Column2 Column3 Column4 Column5 Column6
1  2       2       2       2       2       2
2  2       2       2       2       2       2

[[2]]
  X1 Column2 Column3 Column4 Column5 Column6
1  3       3       3       3       3       3
2  3       3       3       3       3       3

[[3]]
  X1 X2 X3 X4 X5 X6
1  4  4  4  4  4  4
2  4  4  4  4  4  4

目前这是我不满意的方法:

x<-data.frame(matrix(data=rep("2",12),ncol=6))
y<-data.frame(matrix(data=rep("3",12),ncol=6))
z<-data.frame(matrix(data=rep("4",12),ncol=6))
a<-list(x,y,z)

data_frames_to_change<-c("x","y")
library("data.table")

for (i in 1:length(data_frames_to_change)){
setnames(eval(as.name(data_frames_to_change[i])),colnames(eval(as.name(data_frames_to_change[i]))[2:6]),c("Column2","Column3","Column4","Column5","Column6"))
}

a<-list(x,y,z)

我知道这段代码不仅不好,因为它使用循环而不是应用(我仍然是应用新手)。即使在很小的示例数据上,它也非常慢。

我在搜索时发现了这个: Apply a function to each data frame。 如何应用于数据帧的子集?

我认为一个好的答案是找到将更改最后五个列名称的函数应用于数据帧列表中的数据帧子集的方法。这样做时,它不必多次阅读大量列表。

还有几件事,我不知道在这种情况下将字符串转换为变量名称(数据框名称)的最有效方法。我应该使用 eval(as.name()) 以外的东西吗?我正在使用 R 3.03。

感谢您的帮助。

【问题讨论】:

    标签: r dataframe apply


    【解决方案1】:

    试试这个:

    a[1:2] <- lapply(a[1:2], function(thisdf) {
        names(thisdf)[(length(thisdf)-4):length(thisdf)] <- paste0('Column',2:6)
        thisdf
    })
    

    基本上,使用lapply 就像使用for 循环一样,更改指定数据帧的指定列的名称。这会生成一个数据框列表,然后您可以将其存储回原始列表中。

    结果:

    > a
    [[1]]
      X1 Column2 Column3 Column4 Column5 Column6
    1  2       2       2       2       2       2
    2  2       2       2       2       2       2
    
    [[2]]
      X1 Column2 Column3 Column4 Column5 Column6
    1  3       3       3       3       3       3
    2  3       3       3       3       3       3
    
    [[3]]
      X1 X2 X3 X4 X5 X6
    1  4  4  4  4  4  4
    2  4  4  4  4  4  4
    

    【讨论】:

    • 感谢 Thomas 的回答,它对前两个数据帧效果很好。如果我想根据名称(而不是索引)更改数据框的列怎么办?我在想也许这只是意味着将a[1:2] 更改为a[a==c("x","y")。那个 sn-p 不起作用,但是类似的东西。
    • @Tedward 好吧,在您展示的示例中,未命名数据框。 list(x,y,z) 是一个未命名列表(标签“x”、“y”和“z”被丢弃。您需要执行 a &lt;- list(x=x,y=y,z=z) 来创建命名列表,然后您可以将代码更改为 a[c('x','y')] &lt;- lapply(a[c('x','y')], 其他一切都一样。
    • 感谢您向我展示了命名列表和未命名列表之间的区别(我实际上正在为我的数据使用命名列表)。抱歉,我的示例与我的数据并不像我想象的那样相似。答案正是我现在正在寻找的。非常感谢!
    【解决方案2】:

    或者只使用colnames

    colnames(a[[1]])<- c("X1","col2","col3","col4","col5","col6")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 2016-08-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-26
      相关资源
      最近更新 更多