【问题标题】:Summarizing values from multiple rows to unique rows with same IDs将多行中的值汇总为具有相同 ID 的唯一行
【发布时间】:2021-08-11 17:35:59
【问题描述】:

我正在尝试将具有相同 ID 的行汇总为一行,包括来自所有列的值,包括 NA。

我的数据集如下所示:

#    id Date      Red  Green  Blue  Black
#1   1  01-01-21  TRUE NA     NA    NA
#2   1  01-01-21  NA   TRUE   NA    NA
#3   2  05-01-21  TRUE NA     NA    NA       
#4   3  07-01-21  NA   NA     TRUE  NA
#5   3  07-01-21  TRUE NA     NA    NA
#6   3  07-01-21  NA   NA     NA    TRUE

我的结果应该是这样的

#    id Date      Red  Green  Blue  Black
#1   1  01-01-21  TRUE TRUE   NA    NA
#3   2  05-01-21  TRUE NA     NA    NA       
#4   3  07-01-21  TRUE NA     TRUE  TRUE

我已经尝试过以下方法,但“TRUE”被替换为“1”,NA 被替换为“0”。此外,我的“日期”列已被删除。

test <- test %>%
  group_by(id) %>%
  summarize(across(Red:Black, ~sum(.x,  na.rm=TRUE)))

感谢您的帮助!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:
    library(tidyverse)
    df <-
      structure(
        list(
          id = c(1L, 1L, 2L, 3L, 3L, 3L),
          Date = c(
            "01.01.2021",
            "01.01.2021",
            "05.01.2021",
            "07.01.2021",
            "07.01.2021",
            "07.01.2021"
          ),
          Red = c(TRUE, NA, TRUE, NA, TRUE, NA),
          Green = c(NA, TRUE, NA, NA, NA, NA),
          Blue = c(NA, NA, NA, TRUE, NA, NA),
          Black = c(NA, NA, NA, NA, NA, TRUE)
        ),
        class = "data.frame",
        row.names = c(NA, -6L))
    
    df %>% 
      pivot_longer(-c(id, Date), values_drop_na = T) %>% 
      pivot_wider(id_cols = c(id, Date), names_from = name, values_from = value)
    #> # A tibble: 3 x 6
    #>      id Date       Red   Green Blue  Black
    #>   <int> <chr>      <lgl> <lgl> <lgl> <lgl>
    #> 1     1 01.01.2021 TRUE  TRUE  NA    NA   
    #> 2     2 05.01.2021 TRUE  NA    NA    NA   
    #> 3     3 07.01.2021 TRUE  NA    TRUE  TRUE
    

    reprex package (v2.0.1) 于 2021-08-11 创建

    library(tidyverse)
    df %>% 
      group_by(id) %>% 
      fill(everything(), .direction = "downup") %>% 
      distinct() %>%
      ungroup()
    
    #> # A tibble: 3 x 6
    #>      id Date       Red   Green Blue  Black
    #>   <int> <chr>      <lgl> <lgl> <lgl> <lgl>
    #> 1     1 01.01.2021 TRUE  TRUE  NA    NA   
    #> 2     2 05.01.2021 TRUE  NA    NA    NA   
    #> 3     3 07.01.2021 TRUE  NA    TRUE  TRUE
    

    reprex package (v2.0.1) 于 2021-08-11 创建

    【讨论】:

    • 谢谢,效果很好!如果某些 NA 也将另外填充“FALSE”并且我想始终保持值“TRUE”,那么解决方案将如何?在这种情况下,一列不仅存在一个“TRUE”和几个“NA”,而且存在一个“TRUE”和几个“FALSE”和“NA”。
    • 太棒了!如果您认为此答案对您有帮助,您可以通过单击此答案左侧的勾号来接受它:)
    猜你喜欢
    • 2021-08-05
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多