我有以下数据帧列表
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
我该如何实现?
答案 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
或者使用tidyverse
和add_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之后却失去了所有优势。