R-数据框列表-计算并添加新行

时间:2019-07-14 14:53:24

标签: r list

我有以下数据帧列表

d1 <- data.frame(var1 = 10, var2 = 20, var3 = 30)
d2 <- data.frame(var4 = 40, var5 = 50, var6 = 60)
my.list <- list(d1, d2)

> my.list
[[1]]
    var1 var2 var3
  1   10   20   30

[[2]]
    var4 var5 var6
  1   40   50   60

现在,我想向包含以下内容的每个数据框添加新行:

values <- c(0.75, 0.5, 0.25)

d1$var1 * values[1] #new second row d1
d1$var1 * values[2] #new third row d1
d1$var1 * values[3] #new fourth row d1

这需要对每个数据框中的所有$ var变量以及列表中的所有数据框进行。

新的d1看起来像这样:

    var1 var2 var3
  1   10   20   30
  2  7.5   15 22.5
  3    5   10   15
  4  2.5    5  7.5

我该如何实现?

3 个答案:

答案 0 :(得分:5)

一种选择是遍历list并将每一列与'values'向量相乘,而rbind将原始数据行与新行相乘

lapply(my.list, function(x) rbind(x, sapply(x, `*`, values)))
#[[1]]
#  var1 var2 var3
#1 10.0   20 30.0
#2  7.5   15 22.5
#3  5.0   10 15.0
#4  2.5    5  7.5

#[[2]]
#  var4 var5 var6
#1   40 50.0   60
#2   30 37.5   45
#3   20 25.0   30
#4   10 12.5   15

或者使用tidyverseadd_row的{​​{1}}选项

map

答案 1 :(得分:2)

我们可以做到(与@akrun几乎类似)(可能在计算上更加昂贵,并且还具有形成矩阵的缺点):

lapply(my.list,sapply,function(x) append(x,
                                do.call(`*`,list(x,values))))
[[1]]
     var1 var2 var3
[1,] 10.0   20 30.0
[2,]  7.5   15 22.5
[3,]  5.0   10 15.0
[4,]  2.5    5  7.5

[[2]]
     var4 var5 var6
[1,]   40 50.0   60
[2,]   30 37.5   45
[3,]   20 25.0   30
[4,]   10 12.5   15

答案 2 :(得分:0)

这是rapply()的有趣用法。

rapply(my.list, function(x) c(x,x*values), how = 'list')

[[1]]
[[1]]$var1
[1] 10.0  7.5  5.0  2.5

[[1]]$var2
[1] 20 15 10  5

[[1]]$var3
[1] 30.0 22.5 15.0  7.5


[[2]]
[[2]]$var4
[1] 40 30 20 10

[[2]]$var5
[1] 50.0 37.5 25.0 12.5

[[2]]$var6
[1] 60 45 30 15

通过将其包装在lapply(..., data.frame)

中,可以将其恢复为预期的输出
lapply(rapply(my.list, function(x) c(x,x*values), how = 'list' ), data.frame)

[[1]]
  var1 var2 var3
1 10.0   20 30.0
2  7.5   15 22.5
3  5.0   10 15.0
4  2.5    5  7.5

[[2]]
  var4 var5 var6
1   40 50.0   60
2   30 37.5   45
3   20 25.0   30
4   10 12.5   15

rapply()本身速度更快,但是在将结果强制返回到data.frame之后却失去了所有优势。