r - 为列表中的每个数据框传递不同的参数给函数
问题描述
这是我的数据的简化示例:
我有一个数据框列表
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
中的第一个数据帧,以及第二个数据帧等等。list1
data1
B = 20
data2
从我读过的内容来看,mapply
可能是解决方案,但我正在努力解决如何B
在list1
.
任何建议将不胜感激。
解决方案
您需要使用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))))
推荐阅读
- json - 如何按属性值过滤 ARM 模板输出?
- api - 如何正确添加查询参数——颤振
- python - 将高分辨率底部地形添加到 Cartopy 地图
- cmake - Clion 失败并收到 clang:错误:链接器命令失败,退出代码为 1,但它使用 clang++ 工作
- amazon-web-services - 无法将文件从本地推送到 s3
- typescript - 可选类型别名的交集
- python - Python 中的 MQTT on_message 超时
- swift - 如何从我的项目 SwiftUI 启动谷歌地图
- wso2 - 如何在 WSO2 API Manager 中配置 Key 配置(即:Token Endpoint 和 Revoke Endpoint)
- typescript - 未生成导入的类型