【问题标题】:mutate column for multiple dataframes from a list in r从r中的列表中为多个数据帧变异列
【发布时间】:2017-12-17 06:38:45
【问题描述】:

我有一个包含 12 个数据帧的列表:

m  =list(X2016_kvish_1_10t, X2015_kvish_1_10t, X2014_kvish_1_10t,
     X2013_kvish_1_10t, X2012_kvish_1_10t, X2011_kvish_1_10t,
     X2010_kvish_1_10t, X2009_kvish_1_10t, X2008_kvish_1_10t)
     X2007_kvish_1_10t, X2006_kvish_1_10t, X2005_kvish_1_10t)

我有一个包含 12 个向量的列表,称为 mean_values。来自str(mean_values)的输出:

 List of 12
$ : Named num [1:168] 2848 2848 2848 2848 2848 ...
 ..- attr(*, "names")= chr [1:168] "a" "a" "a" "a" ...
$ : Named num [1:168] 2870 2870 2870 2870 2870 ...
..- attr(*, "names")= chr [1:168] "a" "a" "a" "a" ...
$ : Named num [1:168] 2911 2911 2911 2911 2911 ...
 ..- attr(*, "names")= chr [1:168] "a" "a" "a" "a" ...
$ : Named num [1:168] 3422 3422 3422 3422 3422 ...
..- attr(*, "names")= chr [1:168] "a" "a" "a" "a" ...
$ : NULL
$ : Named num [1:168] 2747 2747 2747 2747 2747 ...
..- attr(*, "names")= chr [1:168] "a" "a" "a" "a" ...
$ : Named num [1:168] 3234 3234 3234 3234 3234 ...
..- attr(*, "names")= chr [1:168] "a" "a" "a" "a" ...
$ : Named num [1:168] 3334 3334 3334 3334 3334 ...
..- attr(*, "names")= chr [1:168] "a" "a" "a" "a" ...
$ : Named num [1:168] 3440 3440 3440 3440 3440 3440 3440 3440 3440 3440 ...
..- attr(*, "names")= chr [1:168] "a" "a" "a" "a" ...
$ : Named num [1:168] 3327 3327 3327 3327 3327 ...
 ..- attr(*, "names")= chr [1:168] "a" "a" "a" "a" ...
$ : Named num [1:168] 3440 3440 3440 3440 3440 ...
 ..- attr(*, "names")= chr [1:168] "a" "a" "a" "a" ...
$ : Named num [1:168] 3497 3497 3497 3497 3497 ...
 ..- attr(*, "names")= chr [1:168] "a" "a" "a" "a" ...

我需要将每个向量添加到列表中每个 data.frame 的新列中。当我单独做时效果很好:

X2016_kvish_1_10t$mean_values = mean_values[[1]]
X2016_kvish_1_10t$mean_values = mean_values[[2]]
X2016_kvish_1_10t$mean_values = mean_values[[3]]
# ... until 12

但我需要找到一种方法一次性添加这些矢量。 我试过这个功能:

for(i in 1:length(m)){m[[i]]$means = mean_values[[i]]}

这个函数很好用,但只有当我打印整个数据框列表时。我需要找到一种方法将更改应用于原始日期帧,每个日期帧。

【问题讨论】:

  • 它按您的预期工作。我刚刚在示例数据上尝试了您的代码:df1 <- data.frame(v1=c(1,2),v2=c(3,4)); df2 <- data.frame(v1=c(2,2),v2=c(3,2)); df3 <- data.frame(v1=c(1,1),v2=c(4,4)); m=list(df1,df2,df3); mean_values <- list(c(5,5),c(6,6),c(7,7)); for(i in 1:length(m)){m[[i]]$means = mean_values[[i]]}; m.
  • 它可以工作,但更改似乎不在原始 data.frames 中。如何将此更改应用于原始 data.frames ?
  • 为方便起见,我个人会将它们保留在列表中,但如果您希望它们退出,请尝试this answer 的解决方案-尝试list2env(m, .GlobalEnv)
  • @MichaelSpector - 哦,对了 - 你创建了 m 作为一个未命名的列表。如果你这样做 m = list(X2016_kvish_1_10t = X2016_kvish_1_10t, X2015_kvish_1_10t = X2015_kvish_1_10t, ...) 它应该可以工作。
  • 非常感谢!!!它有效 :) 我本来想给你买礼物的,但我猜你住在世界的另一端 :) 明天见,带着我的新问题,晚安

标签: r list dataframe dplyr


【解决方案1】:

尽管不知道你为什么要这样做...我想我得到了你想要的。

如果您列表中的项目已命名,您可以尝试:

for(i in 1:length(m)){
    assign(names(m)[i], m[[i]])
}

如果您的列表命名不方便,您可以这样命名: names(m) <- ls()[grep(pattern = 'kvish', x = ls(), ignore.case = TRUE)]

如果您的数据框是您内存中唯一名称中包含 kvish 的对象,则此方法将起作用。

但是您必须注意名称的顺序。检查ls()[grep(pattern = 'kvish', x = ls(), ignore.case = TRUE)] 的输出,看看它是否与列表中的数据框顺序相同。

【讨论】:

  • 我试过了,但它给了我一个错误:Error in assign(names(m)[i], m[[i]]) : invalid first argument
  • names(m) 的输出是什么?
猜你喜欢
  • 1970-01-01
  • 2019-11-23
  • 2020-06-22
  • 2020-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
相关资源
最近更新 更多