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

3

我有以下数据框的列表

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个回答

5
一个选项是循环遍历列表,将每列与“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_rowmap 选项

library(tidyverse)
map(my.list, ~  .x %>%
                add_row(!!! map(., `*`, 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
几乎与@akrun的方法相似,我们可以这样做(可能更加计算密集,并且有形成矩阵的缺点): "几乎与 @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

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() 本身速度更快,但在结果被强制转换回数据框后,它失去了所有优势。


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