使用向量循环遍历列表元素,向数据框中添加列。

3
我正在处理几个数据集,这些数据集在很多年内测量了相同的变量。我想给每个数据集添加一个年份变量,更普遍地说,我想循环遍历向量中的元素,并将每个向量作为新列添加到数据帧列表中。这个问题与我的类似,但我想要按顺序将向量中的每个元素作为新列迭代地添加到相应的数据框中: R - New variables over several data frames in a loop 以下是一个样例数据:
year <- c(1:3)
data1 <- data.frame(var1 = c(1:5))
data2 <- data.frame(var1 = c(11:15))
data3 <- data.frame(var1 = c(21:25))
data_list <- list(data1 = data1, data2 = data2, data3 = data3)

我想做这件事,但我认为可能有一些循环(或lapply)的方法,我还没有弄清楚:

data1$year <- year[1]
data2$year <- year[2]
data3$year <- year[3]

由于我有多年的工作经验和数据集要处理,希望能有更高效的解决方案。谢谢!


我不建议这样做,但是... lapply(year, function(x){data_list[[x]][["year"]] <<- x}) - Michael Griffiths
Map(function(x, y){data.frame(x, year = y)}, data_list, year)的翻译是什么? - alistaire
5
@alistaire - 我喜欢这个概念 - Map(cbind, data_list, year=year) 就可以了。 - thelatemail
@thelatemail 很有趣,我从来没有在 ... 中传递命名参数,但现在看到了,感觉很明显! - alistaire
@thelatemail解决了这个问题!非常感谢。我从未使用过Map()函数,所以会研究一下。 - jesskim503
1个回答

1

以下是基于@@thelatemail评论的完整答案:

函数Map(cbind, data_list, year=year)应该可以完成任务。步骤如下:

  • Map函数表示循环遍历列表中的元素
  • cbind附加新创建的列
  • year = years基于向量years中的元素创建名为year的新列

有一个虚拟的例子:
# vector of values you wish to add
years <- c(1:3)     # changed to plural to indicate vector of values rather than single value

# make dummy list of dataframes
data1 <- data.frame(var1 = c(1:5))
data2 <- data.frame(var1 = c(11:15))
data3 <- data.frame(var1 = c(21:25))
data_list <- list(data1 = data1, data2 = data2, data3 = data3)

# Loop through list of dataframes and to each dataframe add a new column
Map(cbind, data_list, year=years)

你希望的输出:
$`data1`
  var1 year
1    1    1
2    2    1
3    3    1
4    4    1
5    5    1

$data2
  var1 year
1   11    2
2   12    2
3   13    2
4   14    2
5   15    2

$data3
  var1 year
1   21    3
2   22    3
3   23    3
4   24    3
5   25    3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接