【问题标题】:Equivalent of dplyr::mutate for lists列表的 dplyr::mutate 等价物
【发布时间】:2019-06-08 03:09:47
【问题描述】:

我有一个包含多个数据框的列表。我想进入列表中的每个数据框,执行将为数据框中的每一行生成一个新列表的操作,然后向包含新列表的每个数据框添加一个新列。

这是一个玩具示例。我从ls_original开始:

ls_original <- list(
    a = data.frame(id = 1:2, name = c("Jon", "Mark")), 
    b = data.frame(id = 3:6, name = c("Matt", "Marc", "Luke", "John"))
)

我正在尝试生成ls_desired:

ls_desired <- list(
    a = data.frame(
        id = 1:2, 
        name = c("Jon", "Mark"), 
        lets = I(list(letters[1:1], letters[1:2]))
    ), 
    b = data.frame(
        id = 3:6, 
        name = c("Matt", "Marc", "Luke", "John"), 
        lets = I(list(letters[1:3], letters[1:4], letters[1:5], letters[1:6]))
    )
)

我想写一个将ls_original转换为ls_desired的函数:

ls_desired <- list_mutate_function(ls_original)

我已经尝试了以下功能。他们提供了需要添加到ls_original 以生成ls_desired 的新数据,但我不知道如何将ls_failedls_original 结合以生成ls_desired

ls_failed1 <- ls_original %>% 
    lapply(function(x) {
        apply(x, 1, function(y) {
            letters[1:y[["id"]]]
        })
    })
ls_failed1

library(plyr)
ls_failed2 <- ls_original %>% 
    plyr::llply(function(x) {
        apply(x, 1, function(y) {
            letters[1:y[["id"]]]
        })
    })
ls_failed2

我也试过lplyr::mutate 无济于事。谢谢。

【问题讨论】:

    标签: r list dplyr


    【解决方案1】:

    您可以使用嵌套的map() 方法。

    library(purrr)
    library(dplyr)
    
    map(ls_original, ~mutate(.x, lets = map(id, ~letters[1:.x])))
    
    $a
      id name lets
    1  1  Jon    a
    2  2 Mark a, b
    
    $b
      id name             lets
    1  3 Matt          a, b, c
    2  4 Marc       a, b, c, d
    3  5 Luke    a, b, c, d, e
    4  6 John a, b, c, d, e, f
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 2017-09-23
      • 2022-06-21
      • 2019-12-14
      • 2019-12-12
      • 1970-01-01
      • 2017-10-14
      相关资源
      最近更新 更多