gpt4 book ai didi

r - 创建具有可变尺寸的嵌套数据框

转载 作者:行者123 更新时间:2023-12-01 08:14:20 25 4
gpt4 key购买 nike

我有一个数据框,其中一列 keys 描述了所有剩余列的格式。在下面的示例中有 2 个这样的值列,但通常可能有更多。

library(tidyverse)

dat = tribble(
~id, ~keys, ~vals1, ~vals2,
1, "A/B", "1/2", "11/12",
3, "C/D/E", "6/7/8", "16"
)

我想将这些列转换为嵌套数据框的单列:在每一行中,值应按 "/" 拆分并形成数据框的行,并采用标题来自 keys 条目。

值列中的条目可能会被截断,在这种情况下,应该使用 NA 来表示缺失值(即示例中的条目 "16" 应该解释为 "16/NA/NA".)

以下代码为这种特殊情况生成所需的列:

res = dat %>%
mutate_at(vars(keys:last_col()), str_split, pattern = fixed("/")) %>%
mutate(df = pmap(select(., keys:last_col()),
~ bind_rows(setNames(..2, ..1[1:length(..2)]),
setNames(..3, ..1[1:length(..3)]))))
res$df
#> [[1]]
#> # A tibble: 2 x 2
#> A B
#> <chr> <chr>
#> 1 1 2
#> 2 11 12
#>
#> [[2]]
#> # A tibble: 2 x 3
#> C D E
#> <chr> <chr> <chr>
#> 1 6 7 8
#> 2 16 <NA> <NA>

我的问题是如何泛化到更大(和未知)数量的列。此外,我对 setNames 的使用感觉相当笨拙,我希望使用更优雅的东西。

我主要是在寻找 tidyverse 解决方案,但也欢迎使用其他方法。

更新

我应该强调的是,我正在寻找的输出是一个单个数据帧,包含列id(未更改)和df (嵌套数据框列表)。

(原始键/值列并不重要;它们可能会被删除。)

这是上面例子中想要的结构:

str(res %>% select(id, df))
#> Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of 2 variables:
#> $ id: num 1 3
#> $ df:List of 2
#> ..$ :Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of 2 variables:
#> .. ..$ A: chr "1" "11"
#> .. ..$ B: chr "2" "12"
#> ..$ :Classes 'tbl_df', 'tbl' and 'data.frame': 2 obs. of 3 variables:
#> .. ..$ C: chr "6" "16"
#> .. ..$ D: chr "7" NA
#> .. ..$ E: chr "8" NA

最佳答案

这里是 reshape 后的另一种选择

library(dplyr)
library(tidyr)
library(purrr)
dat %>%
pivot_longer(matches("vals\\d+")) %>%
select(-id) %>%
pivot_wider(names_from = keys, values_from = value) %>%
select(-name) %>%
split.default(seq_along(.)) %>%
map(~ .x %>%
separate(names(.), into = str_split(names(.), fixed("/")) %>%
unlist, sep="[/]"))

关于r - 创建具有可变尺寸的嵌套数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58844595/

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