tidyr聚集:同时收集并重命名密钥?

时间:2015-06-17 20:09:40

标签: r tidyr

假设我有以下数据框:

> a <- data_frame(my_type_1_num_widgets = c(1, 2, 3), my_type_2_num_widgets = c(4, 5, 6))
> a
Source: local data frame [3 x 2]

  my_type_1_num_widgets my_type_2_num_widgets
1                     1                     4
2                     2                     5
3                     3                     6

我想做两件事:

  1. 收集&#34; num_widgets&#34;列。
  2. 重命名生成的键以删除&#34; num_widgets&#34;后缀。
  3. 我目前正在这样做的方式,以及我得到的正确/期望的输出:

    > a %>% 
        rename(my_type_1 = my_type_1_num_widgets, 
               my_type_2 = my_type_2_num_widgets) %>% 
        gather(type, num_widgets, my_type_1:my_type_2)
    Source: local data frame [6 x 2]
    
           type num_widgets
    1 my_type_1           1
    2 my_type_1           2
    3 my_type_1           3
    4 my_type_2           4
    5 my_type_2           5
    6 my_type_2           6
    

    有没有办法一步到位?

2 个答案:

答案 0 :(得分:2)

尝试:

a %>% 
  gather(type, num_widgets) %>% ## gather the "num_widgets" columns
  mutate(type = sub("_num_widgets", "", type)) ## remove the suffix

给出了:

#Source: local data frame [6 x 2]
#
#       type num_widgets
#1 my_type_1           1
#2 my_type_1           2
#3 my_type_1           3
#4 my_type_2           4
#5 my_type_2           5
#6 my_type_2           6

答案 1 :(得分:2)

tidyr 1.0.0 起,您可以执行以下操作:

library(tidyverse)
a <- tibble(my_type_1_num_widgets = c(1, 2, 3), my_type_2_num_widgets = c(4, 5, 6))


pivot_longer(a, everything(), 
             names_to = c("type",".value"), 
             names_pattern = "(.*?)_(num_widgets)") %>%
  arrange(type)
#> # A tibble: 6 x 2
#>   type      num_widgets
#>   <chr>           <dbl>
#> 1 my_type_1           1
#> 2 my_type_1           2
#> 3 my_type_1           3
#> 4 my_type_2           4
#> 5 my_type_2           5
#> 6 my_type_2           6

reprex package(v0.3.0)于2019-09-19创建