【问题标题】:Passing different arguments to function for each dataframe in a list为列表中的每个数据框传递不同的参数给函数
【发布时间】:2020-01-17 12:08:54
【问题描述】:

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

我有一个数据框列表

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))

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

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

B 的值来自data5,因此B = 10 用于list1 中的第一个数据帧(即data1),B = 20 用于第二个数据帧data2 等等.

根据我的阅读,mapply 可能是解决方案,但我正在努力研究如何在list1 的每个数据框中的所有行中指定单个值 B

任何建议将不胜感激。

【问题讨论】:

    标签: r lapply


    【解决方案1】:

    您需要使用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))))
    

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 1970-01-01
      • 2019-07-23
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多