【问题标题】:How can you gather() multiple columns at the same time in dplyr (R)?如何在 dplyr (R) 中同时收集()多个列?
【发布时间】:2019-05-07 14:04:03
【问题描述】:

我正在尝试收集从宽格式到长格式的杂乱数据。 我有 748 个变量,需要压缩到大约 30 个。

this post,我问:如何整理我的宽数据?答案:使用gather()。

但是,我仍在努力收集多个列,并希望您能指出我哪里出错了。

可重现的例子:

tb1 <- tribble(~x1,~x2,~x3,~y1,~y2,~y3,
       1,NA,NA,NA,1,NA,
       NA,1,NA,NA,NA,1,
       NA,NA,1,NA,NA,1)

# A tibble: 3 x 6
#     x1    x2    x3 y1       y2    y3
#  <dbl> <dbl> <dbl> <lgl> <dbl> <dbl>
#1     1    NA    NA NA        1    NA
#2    NA     1    NA NA       NA     1
#3    NA    NA     1 NA       NA     1

x1-y3 具有以下特点:

1 x1    Green 
2 x2    Yellow
3 x3    Orange
4 y1    Yes   
5 y2    No    
6 y3    Maybe 

我试过了:

tb1 %>%
  rename("Green" =x1,
         "Yellow"=x2,
         "Orange"=x3,
         "Yes"=y1,
         "No"=y2,
         "Maybe"=y3) %>%
  gather(X,val,-Green,-Yellow,-Orange) %>%
  gather(Y,val,-X) %>%
  select(-val)

我确实得到了我想要的这些变量的输出,但我无法想象如何为 700 多个变量执行此操作?!有没有更有效的方法?

tb1 %>%
  rename("Green" =x1,
         "Yellow"=x2,
         "Orange"=x3,
         "Yes"=y1,
         "No"=y2,
         "Maybe"=y3) %>%
  gather(X,val,-Green,-Yellow,-Orange) %>%
  filter(!is.na(val)) %>%
  select(-val) %>%
  gather(Y,val,-X) %>%
  filter(!is.na(val)) %>%
  select(-val)

# A tibble: 3 x 2
  X     Y     
  <chr> <chr> 
1 No    Green 
2 Maybe Yellow
3 Maybe Orange

我想我可能对gather() 不够熟悉,所以这可能是一个愚蠢的问题——希望能得到帮助。谢谢!

【问题讨论】:

    标签: r select dplyr tidyr


    【解决方案1】:

    我假设这里的问题是手动指定所有不同的变量名称。幸运的是,tidyverse 具有 ?select_helpers,它可以更轻松地根据不同的规则选择列。

    我们可以在最后重命名它们,而不是在开头重命名变量。这让我们可以使用starts_with 来获取以xy 开头的所有列,并一步将它们收集在一起。然后我们可以使用ends_with 从这些收集步骤中选择值列并过滤并删除它们。

    最后,我们使用mutate_all 和一个查找表将x1y1 等的所有值替换为它们的真实值

    # Make lookup table to match X and Y variables with Values
      # the initial values should be the `names` (first) and the values to change them to
      # should be the `values` (after the =)
    lookup <- c('x1' = 'Green',
                'x2' = 'Yellow',
                'x3' = 'Orange',
                'y1' = 'Yes',
                'y2' = 'No',
                'y3' = 'Maybe')
    
    tb1 %>%
        gather(X, Xval, starts_with('x')) %>%    # Gather all variables that start with ‘x'
        gather(Y, Yval, starts_with('y')) %>%    # Gather all variables that start with ‘y'
        filter_at(vars(ends_with('val')),        # Looking in columns ending with ‘val'
                  all_vars(!is.na(.))) %>% %>%    # Drop rows if ANY of these cols are NA
        select(-ends_with('val')) %>%            # Drop columns ending in ‘val'
        mutate_all(~lookup[.])                   # Replace value from lookup table in all cols
    
    # A tibble: 3 x 2
      X      Y 
      <chr>  <chr>
    1 Green  No   
    2 Yellow Maybe
    3 Orange Maybe
    

    select_helpers 的一个棘手问题是知道何时单独使用它们以及何时需要向vars“注册”它们。在gatherselect 中,您可以按原样使用它们。在mutatefiltersummarize等中,需要用vars包围它们

    【讨论】:

    • 感谢您的帮助,这样可以节省时间。我发现我的聚会仍然有点混乱 - 为这个不好的问题道歉,有时很难问一个问题,尤其是当你不知道出了什么问题的时候!非常感谢您的帮助:)
    猜你喜欢
    • 1970-01-01
    • 2021-06-01
    • 2019-04-08
    • 2018-04-07
    • 2018-05-19
    • 2018-06-13
    • 1970-01-01
    • 2016-11-23
    • 2015-03-30
    相关资源
    最近更新 更多