gpt4 book ai didi

r - 基于谓词函数改变数据帧的列(dplyr::mutate_if)

转载 作者:行者123 更新时间:2023-12-02 17:14:16 25 4
gpt4 key购买 nike

我想使用 dplyr 的 mutate_if() 函数将列表列转换为数据帧列,但当我尝试这样做时遇到了令人费解的错误。我正在使用 dplyr 0.5.0、purrr 0.2.2、R 3.3.0。

基本设置如下所示:我有一个数据框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()

最佳答案

原始的 tblfy 函数对我来说是错误的(即使它的元素直接链接),所以让我们稍微重建一下它,同时添加向量化,这让我们避免了原本必要的先验 rowwise()调用:

tblfy <- Vectorize(function(x){x %>% purrr::map_df(identity) %>% list()})

现在我们可以很好地使用mutate_if:

d %>% mutate_if(purrr::is_list, tblfy)
## Source: local data frame [2 x 2]
##
## A B
## <list> <chr>
## 1 <tbl_df [2,2]> A
## 2 <tbl_df [2,2]> B

...如果我们解开嵌套看看那里有什么,

d %>% mutate_if(purrr::is_list, tblfy) %>% tidyr::unnest()
## Source: local data frame [4 x 3]
##
## B x y
## <chr> <chr> <dbl>
## 1 A a 1
## 2 A b 2
## 3 B c 3
## 4 B d 4

一些注意事项:

  • map_df(identity) 似乎在构建 tibble 方面比任何替代公式都更有效。我知道 identity 调用似乎没有必要,但大多数其他内容都会崩溃。
  • 我不确定 tblfy 的用途有多大,因为它在某种程度上取决于列表列中列表的结构,而列表的结构可能有很大差异。不过,如果您有很多类似结构的东西,我认为它很有用。
  • 可能有一种方法可以使用 pmap 而不是 Vectorize 来实现此目的,但我无法通过一些粗略的尝试让它工作。

关于r - 基于谓词函数改变数据帧的列(dplyr::mutate_if),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38252437/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com