我有以下数据框列表
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
Run Code Online (Sandbox Code Playgroud)
现在,我想向每个包含以下内容的数据框添加新行:
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
Run Code Online (Sandbox Code Playgroud)
需要对每个数据帧中的所有$ 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
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
一种选择是遍历list并将每列与“值”向量相乘,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
Run Code Online (Sandbox Code Playgroud)
或tidyverse使用add_row和的选项map
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
Run Code Online (Sandbox Code Playgroud)