Эквивалент dplyr :: mutate для списков - PullRequest
0 голосов
/ 08 июня 2019

У меня есть список, который содержит несколько фреймов данных. Я хочу войти в каждый фрейм данных в списке, выполнить операцию, которая создаст новый список для каждой строки во фреймах данных, а затем добавить новый столбец в каждый фрейм данных, содержащий новые списки.

Вот игрушечный пример. Я начинаю с 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_failed с ls_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 безрезультатно. Спасибо.

1 Ответ

3 голосов
/ 08 июня 2019

Вы можете использовать вложенный 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
...