我想使用dplyr的mutate_if()
函数将list-columns转换为data-frame-columns,但是当我试图将数据框列转换为令人费解的错误时这样做。我使用dplyr 0.5.0,purrr 0.2.2,R 3.3.0。基于谓词函数的数据框的变化列(dplyr :: mutate_if)
基本设置是这样的:我有一个数据帧d
,其中一些人的列列表:
d <- dplyr::data_frame(
A = list(
list(list(x = "a", y = 1), list(x = "b", y = 2)),
list(list(x = "c", y = 3), list(x = "d", y = 4))
),
B = LETTERS[1:2]
)
我想列出的列转换(在这种情况下,d$A
)到使用下面的函数的数据帧的柱:
tblfy <- function(x) {
x %>%
purrr::transpose() %>%
purrr::simplify_all() %>%
dplyr::as_data_frame()
}
即,我想列表列d$A
到由列表lapply(d$A, tblfy)
,这是
[[1]]
# A tibble: 2 x 2
x y
<chr> <dbl>
1 a 1
2 b 2
[[2]]
# A tibble: 2 x 2
x y
<chr> <dbl>
1 c 3
2 d 4
当然,在这种简单的情况下,我可以做一个简单的重新分配。然而,重点是我希望以一种通用的方式通过编程方式完成这项工作,理想情况下是使用dplyr,可以处理任意数量的列表列。
这里就是我绊倒:当我尝试使用下面的应用
d %>% dplyr::mutate_if(is.list, funs(tblfy))
我得到一个错误信息,我不知道如何解释到转换列表列数据帧列:
Error: Each variable must be named.
Problem variables: 1, 2
为什么mutate_if()
失败?我如何正确地应用它来获得期望的结果?
备注
一个评论者指出,功能tblfy()
应该被量化。这是一个合理的建议。但是 - 除非我错误地进行了矢量化 - 这似乎并没有解决问题的根源。堵在tblfy()
向量化版本,
tblfy_vec <- Vectorize(tblfy)
到mutate_if()
失败,出现错误
Error: wrong result size (4), expected 2 or 1
更新
获得与purrr一些经验后,现在我发现下面的方法自然,如果有点啰嗦:
d %>%
map_if(is.list, ~ map(., ~ map_df(., identity))) %>%
as_data_frame()
这与@ alistaire的解决方案或多或少相同,但使用map_if()
, map()
,代替mutate_if()
, Vectorize()
。
那么究竟是什么样的预期产出呢?你想将列表中的A从列表中更改为一个骰子列表? – MrFlick
你的功能不是矢量化的,它只接受一个列表。看看'tblfy(d $ A)'。有一个错误,因为'd $ A'中有两个列表。你不是在比较苹果和苹果。在你的'lapply(d $ A,tblfy)'中,你一次给你的函数列出一个列表,这就是它的原因。 'tblfy(d $ A [[1]])''和'tblfy(d $ A [[2]])''。在你的dplyr函数中,你提供了两个列表。将'tblfy'更改为接受多个列表,或更改dplyr调用。或者如弗里克先生所问,更广泛地思考你正在建设什么。 –
@MrFlick我编辑了这个问题,以使所需的输出清晰。现在清楚吗? – egnha