我有一个包含多个数据帧的列表。我想进入列表中的每个数据帧,执行一项操作,将为数据帧中的每一行生成一个新列表,然后向包含新列表的每个数据帧中添加一个新列。
这是一个玩具示例。我从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
组合以生成{{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
无济于事。谢谢。
答案 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