【问题标题】:Group by, summarize, spread in R not working分组,总结,在 R 中传播不起作用
【发布时间】:2020-08-01 11:05:24
【问题描述】:

我有一个如下所示的数据框:

  ID  Code  Desc
  1   0A    Red
  1   NA    Red
  2   1A    Blue
  3   2B    Green

我想首先创建一个新列,在其中连接 ID 相同的代码列中的值。所以:

  ID  Combined_Code  Desc
  1    0A | NA       Red
  2    1A            Blue
  3    2B            Green

那我想把原来的 Code 栏目拿出来传一下。在这种情况下,值将是每个代码针对给定 ID 显示的次数。所以:

  ID  Combined_Code 0A  NA  1A  2B  Desc
  1    0A | NA      1   1   0   0   Red
  2    1A           0   0   1   0   Blue
  3    2B           0   0   0   1   Green

我试过了:

sample_data %>%
 group_by(ID) %>%
 summarise(Combined_Code = paste(unique(Combined_Code), collapse ='|'))

这适用于创建串联。但是,我不能让它与传播一起工作:

 sample_data %>%
  group_by(ID) %>%
  summarise(Combined_Code = paste(unique(Combined_Code), collapse ='|'))

sample_data <- spread(count(sample_data, ID, Combined_Code, Desc., Code), Code, n, fill = 0)

这样做会扩展,但会丢弃串联。我也尝试过使用过滤器而不是摘要,这给出了相同的结果。这导致:

 ID  Combined_Code 0A  NA  1A  2B  Desc
  1    0A          1   0   0   0   Red
  1    NA          0   1   0   0   Red
  2    1A          0   0   1   0   Blue
  3    2B          0   0   0   1   Green

最后,我尝试了通过汇总函数进行管道传播:

sample_data %>%
  group_by(ID) %>%
  summarise(Combined_Code = paste(unique(Combined_Code), collapse ='|')) %>%
  spread(count(sample_data, ID, Combined_Code, Desc., Code), Code, n, fill = 0)

这会导致错误:

Error: `var` must evaluate to a single number or a column name, not a list
Run `rlang::last_error()` to see where the error occurred.

我能做些什么来解决这些问题?

【问题讨论】:

    标签: r summarize spread


    【解决方案1】:

    我们可以通过paste做一个群

    library(dplyr)
    library(stringr)
    df1 %>%
       group_by(ID, Desc) %>%
       summarise(Combined_Code = str_c(Code, collapse="|"))
    # A tibble: 3 x 3
    # Groups:   ID [3]
    #     ID Desc  Combined_Code
    #  <int> <chr> <chr>        
    #1     1 Red   0A|0B        
    #2     2 Blue  1A           
    #3     3 Green 2B     
    

    对于第二种情况,在创建 1s 的 'val' 列后,paste 按 'ID'、'Desc' 分组后的 'Code' 元素,然后使用 pivot_wider from tidyr 从 ' reshape long' 到 '宽格式。

    library(tidyr)
    df1 %>% 
       mutate(val = 1) %>%
       group_by(ID, Desc) %>% 
       mutate(Combined_Code = str_c(Code, collapse="|")) %>% 
       pivot_wider(names_from = Code, values_from = val, values_fill = list(val = 0))
    # A tibble: 3 x 7
    # Groups:   ID, Desc [3]
    #    ID Desc  Combined_Code  `0A`  `0B`  `1A`  `2B`
    #  <int> <chr> <chr>         <dbl> <dbl> <dbl> <dbl>
    #1     1 Red   0A|0B             1     1     0     0
    #2     2 Blue  1A                0     0     1     0
    #3     3 Green 2B                0     0     0     1
    

    OP 的预期输出是

      ID  Combined_Code 0A  0B  1A  2B  Desc
      1    0A | 0B      1   1   0   0   Red
      2    1A           0   0   1   0   Blue
      3    2B           0   0   0   1   Green
    

    更新

    对于更新后的数据集,“代码”中有 NA 元素,默认情况下 str_c 返回 NA 如果有任何 NA 作为元素之一,而 paste 仍然返回 NA 以及其他元素。在这里,我们将str_c 替换为paste

    df2 %>% 
        mutate(val = 1) %>%
        group_by(ID, Desc) %>% 
        mutate(Combined_Code = paste(Code, collapse="|")) %>% 
        pivot_wider(names_from = Code, values_from = val, values_fill = list(val = 0))
    # A tibble: 3 x 7
    # Groups:   ID, Desc [3]
    #     ID Desc  Combined_Code  `0A`  `NA`  `1A`  `2B`
    #  <int> <chr> <chr>         <dbl> <dbl> <dbl> <dbl>
    #1     1 Red   0A|NA             1     1     0     0
    #2     2 Blue  1A                0     0     1     0
    #3     3 Green 2B                0     0     0     1
    

    数据

    df1 <- structure(list(ID = c(1L, 1L, 2L, 3L), Code = c("0A", "0B", "1A", 
    "2B"), Desc = c("Red", "Red", "Blue", "Green")), 
    class = "data.frame", row.names = c(NA, 
    -4L))
    
    
    
    df2 <- structure(list(ID = c(1L, 1L, 2L, 3L), Code = c("0A", NA, "1A", 
    "2B"), Desc = c("Red", "Red", "Blue", "Green")), class = "data.frame",
    row.names = c(NA, 
    -4L))
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2015-10-10
    • 1970-01-01
    相关资源
    最近更新 更多