gpt4 book ai didi

r - tidyr::expand() 用于跨组的单个列

转载 作者:行者123 更新时间:2023-12-03 15:49:45 25 4
gpt4 key购买 nike

tidyr::expand()从多列返回所有可能的值组合。我正在寻找一种稍微不同的行为,其中所有值都在一个列中,并且要跨组进行组合。

例如,让数据定义如下:

library( tidyverse )
X <- bind_rows( data_frame(Group = "Group1", Value = LETTERS[1:3]),
data_frame(Group = "Group2", Value = letters[4:5]) )

我们想要来自 Group1 的所有值组合值来自 Group2 .我目前笨拙的解决方案是将多个列中的值分开
Y <- X %>% group_by(Group) %>% do(vals = .$Value) %>% spread(Group, vals)
# # A tibble: 1 x 2
# Group1 Group2
# <list> <list>
# 1 <chr [3]> <chr [2]>

后跟一个双 unnest手术
Y %>% unnest( .preserve = Group2 ) %>% unnest
# # A tibble: 6 x 2
# Group1 Group2
# <chr> <chr>
# 1 A d
# 2 A e
# 3 B d
# 4 B e
# 5 C d
# 6 C e

这是所需的输出,但您可以想象,此解决方案不能很好地概括:随着组数的增加, unnest 的数量也随之增加。我们必须执行的操作。

有没有更优雅的解决方案?

最佳答案

因为 OP 似乎很乐意使用 base ,我将我的评论升级为答案:

expand.grid(split(X$Value, X$Group))
# Group1 Group2
# 1 A d
# 2 B d
# 3 C d
# 4 A e
# 5 B e
# 6 C e

正如 OP 所指出的, expand.grid将字符向量转换为因子。为了防止这种情况,请使用 stringsAsFactors = FALSE .
tidyverse相当于 purrr::cross_df ,这不会强制因子:
cross_df(split(X$Value, X$Group))
# A tibble: 6 x 2
# Group1 Group2
# <chr> <chr>
# 1 A d
# 2 B d
# 3 C d
# 4 A e
# 5 B e
# 6 C e

关于r - tidyr::expand() 用于跨组的单个列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50535948/

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