首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按列前缀嵌套tibble

按列前缀嵌套tibble
EN

Stack Overflow用户
提问于 2022-07-02 12:58:53
回答 3查看 64关注 0票数 0

我们按行进行正常的嵌套分组。我的不一样。我希望按照列前缀(在第一个‘_’之前)创建一个嵌套的tibble分组,在嵌套的tibbles中保留原来的列名。目前的方法有效,但看起来过于复杂。

代码语言:javascript
复制
tibble(a_1=1:3, a_2=2:4, b_1=3:5) %>% 
    print() %>%

#  A tibble: 3 x 3
#     a_1   a_2   b_1
#   <int> <int> <int>
# 1     1     2     3
# 2     2     3     4
# 3     3     4     5

    pivot_longer(everything()) %>% 
    nest(data=-name) %>% 
    mutate(data=map2(data, name, ~rename(.x, '{.y}' := value))) %>% 
    mutate(gr=str_extract(name, '^[^_]+'), .keep='unused') %>% 
    nest(data=-gr) %>% 
    mutate(data=map(data, ~bind_cols(.[[1]]))) %>%
    print() %>%

# A tibble: 2 x 2
#   gr    data            
#   <chr> <list>          
# 1  a     <tibble [3 x 2]>
# 2  b     <tibble [3 x 1]>

    { .$data[[1]] }

# A tibble: 3 x 2
#     a_1   a_2
#   <int> <int>
# 1     1     2
# 2     2     3
# 3     3     4

UPD:如果可能的话,tidyverse解决方案

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-07-02 13:19:55

用我最近学到的一个巧妙的小技巧,你可以做到:

代码语言:javascript
复制
library(tidyr)
library(dplyr, warn = FALSE)

tibble(a_1 = 1:3, a_2 = 2:4, b_1 = 3:5) %>%
  split.default(., gsub("_[0-9]", "", names(.))) %>%
  lapply(nest, data = everything()) %>%
  bind_rows(.id = "gr")
#> # A tibble: 2 × 2
#>   gr    data            
#>   <chr> <list>          
#> 1 a     <tibble [3 × 2]>
#> 2 b     <tibble [3 × 1]>
票数 3
EN

Stack Overflow用户

发布于 2022-07-03 10:47:28

基于purrr::map_dfr的另一种可能的解决方案

代码语言:javascript
复制
library(tidyverse)

map_dfr(unique(str_remove(names(df), "_\\d+")), 
  ~ tibble(gr = .x, nest(select(df, which(str_detect(names(df), .x))), 
      data = everything())))

#> # A tibble: 2 × 2
#>   gr    data            
#>   <chr> <list>          
#> 1 a     <tibble [3 × 2]>
#> 2 b     <tibble [3 × 1]>
票数 2
EN

Stack Overflow用户

发布于 2022-07-04 12:55:16

我的版本,稍微修改了一些,整理过的stepan's answer版本

代码语言:javascript
复制
tibble(a_1 = 1:3, a_2 = 2:4, b_1 = 3:5) %>%
    split.default(str_extract(names(.), "^[^_]+")) %>%
    map(nest, data = everything()) %>%
    bind_rows(.id = "gr")

找不到替代split.default()的方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72839231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档