R-数据框列表-如何添加列

时间:2019-07-13 16:46:52

标签: r list

我有一个数据帧列表(my.list)

d1 <- data.frame(ref = c(1, 2, 3), y2 = c(4, 5, 6), y3 = c(7, 8, 9), y4 = c(10, 11, 12))
d2 <- data.frame(ref = c(3, 2, 1), y2 = c(6, 5, 4), y3 = c(9, 8, 1))
my.list <- list(d1, d2)

d1
    ref y2 y3 y4
  1   1  4  7 10
  2   2  5  8 11
  3   3  6  9 12

现在,我想向此列表中的每个数据框添加一些具有绝对差值的列。我将使用以下for循环对数据帧d1进行此操作

for (i in names(d1)[2:length(names(d1))]){
   d1[[paste(i, 'abs_diff', sep="_")]] <- abs(d1[,i]-d1[,2])
}

d1然后看起来像这样:

    ref y2 y3 y4 y2_abs_diff y3_abs_diff y4_abs_diff
  1   1  4  7 10           0           3           6
  2   2  5  8 11           0           3           6
  3   3  6  9 12           0           3           6

但是,现在我该如何对my.list的所有数据帧执行一次操作?我知道我应该为此使用'lapply',但是我无法使其正常工作。

1 个答案:

答案 0 :(得分:1)

Wee可以使用lapply遍历list并通过分配来创建新列

my.list1 <- lapply(my.list, function(x) {
    x[paste0(names(x)[2:length(x)], "abs_diff")] <- abs(x[-1] - x[,2])
    x
 })
my.list1
#[[1]]
#  ref y2 y3 y4 y2abs_diff y3abs_diff y4abs_diff
#1   1  4  7 10          0          3          6
#2   2  5  8 11          0          3          6
#3   3  6  9 12          0          3          6

#[[2]]
#  ref y2 y3 y2abs_diff y3abs_diff
#1   3  6  9          0          3
#2   2  5  8          0          3
#3   1  4  1          0          3

注意:当只有一个列要采用差异时,由于回收,它将回收值以在每个列中进行操作。否则,我们可以通过复制列或循环来使尺寸相同(如OP的文章中所述)