等效于dplyr :: mutate用于列表

时间:2019-06-08 03:09:47

标签: r list mutate

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

这是一个玩具示例。我从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组合以生成{{1 }}。

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 无济于事。谢谢。

1 个答案:

答案 0 :(得分:3)

您可以使用嵌套的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