首页 > 解决方案 > 为列表中的每个数据框传递不同的参数给函数

问题描述

这是我的数据的简化示例:

我有一个数据框列表

set.seed(1)
data1 <- data.frame(A = sample(1:10))
data2 <- data.frame(A = sample(1:10))
data3 <- data.frame(A = sample(1:10))
data4 <- data.frame(A = sample(1:10))
list1 <- list(data1, data2, data3, data4)

和一个包含与数据帧相同数量的值的数据帧list1

data5 <- data.frame(B = c(10, 20, 30, 40))

我想C在每个数据框中创建一个新列,list1其中:

C = A * (B/nrow(A))

B具有来自的值data5,因此对于(即)B = 10中的第一个数据帧,以及第二个数据帧等等。list1data1B = 20data2

从我读过的内容来看,mapply可能是解决方案,但我正在努力解决如何Blist1.

任何建议将不胜感激。

标签: rlapply

解决方案


您需要使用Map循环不同的向量或并行列表:

Map(function(df, B) transform(df, C = A*(B/nrow(df))),list1,data5$B)
#> [[1]]
#>     A  C
#> 1   8  8
#> 2  10 10
#> 3   1  1
#> 4   6  6
#> 5   7  7
#> 6   9  9
#> 7   3  3
#> 8   4  4
#> 9   2  2
#> 10  5  5
#> 
#> [[2]]
#>     A  C
#> 1  10 20
#> 2   3  6
#> 3   2  4
#> 4   1  2
#> 5   9 18
#> 6   4  8
#> 7   6 12
#> 8   5 10
#> 9   8 16
#> 10  7 14
#> 
#> [[3]]
#>     A  C
#> 1   5 15
#> 2   7 21
#> 3   1  3
#> 4   4 12
#> 5   2  6
#> 6   6 18
#> 7  10 30
#> 8   3  9
#> 9   8 24
#> 10  9 27
#> 
#> [[4]]
#>     A  C
#> 1   3 12
#> 2   9 36
#> 3   6 24
#> 4   4 16
#> 5   2  8
#> 6   1  4
#> 7  10 40
#> 8   5 20
#> 9   7 28
#> 10  8 32

使用tidyverse可以更紧凑一些:

library(tidyverse)
map2(list1, data5$B, ~mutate(.x, C = A*(.y/nrow(.x))))

推荐阅读