【问题标题】:R - list of dataframes - how to add columnsR - 数据框列表 - 如何添加列
【发布时间】:2019-07-13 16:46:52
【问题描述】:

我有一个数据框列表 (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”,但我无法让它工作。

【问题讨论】:

    标签: r list


    【解决方案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 的帖子中所示)

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多