【问题标题】:Remove NAs after pivot_wider to match up rows在 pivot_wider 之后删除 NA 以匹配行
【发布时间】:2020-03-09 19:38:10
【问题描述】:

我使用pivot_wider 展开一列,因此我可以使用 xy 图比较两组(var1 与 var2)。但我无法比较它们,因为列中有相应的 NA。

这是一个示例数据框:

 df <- data.frame(group = c("a", "a", "b", "b", "c", "c"), var1 = c(3, NA, 1, NA, 2, NA), 
            var2 = c(NA, 2, NA, 4, NA, 8))

我希望它看起来像:

df2 <- data.frame(group = c("a", "b", "c"), var1 = c(3, 1, 2), 
            var2 = c( 2,  4, 8))

【问题讨论】:

  • pivot_wider使用的数据框是什么?
  • 我不知道为什么需要用pivot_wider 来解决这个问题,如答案所示,这看起来就像是按总和分组。可能重复stackoverflow.com/questions/9723208/…

标签: r dplyr tidyr


【解决方案1】:

您可以使用汇总。但这只是治标不治本。您可能在id_cols 中有一个列,它与您在values_from 中的变量是一对一的。

library(dplyr)

df %>%
  group_by(group) %>%
  summarize_all(sum, na.rm = T)

# A tibble: 3 x 3
  group  var1  var2
  <fct> <dbl> <dbl>
1 a         3     2
2 b         1     4
3 c         2     8

【讨论】:

    【解决方案2】:

    这个解决方案更健壮一些,以更通用的data.frame开头:

    df <- data.frame(col_1 = c("A", "A", "A", "A", "A", "A", "B", "B", "B"), 
                     col_2 = c(1, 3, NA, NA, NA, NA, 4, NA, NA),
                     col_3 = c(NA, NA, 2, 5, NA, NA, NA, 5, NA),
                     col_4 = c(NA, NA, NA, NA, 5, 6, NA, NA, 7))
    
    df %>% dplyr::group_by(col_1) %>% 
      dplyr::summarise_all(purrr::discard, is.na)
    

    【讨论】:

      【解决方案3】:

      这是一种方法,假设您只有两行按组和一行不适用

      library(dplyr)
      df %>% group_by(group) %>% 
             summarise(var1=max(var1,na.rm=TRUE),
                       var2=max(var2,na.rm=TRUE))
      

      na.rm=TRUE 不会计算 NA 并仅在一个值(不是 NA 的那个)上获得最大值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-21
        • 2018-09-13
        • 1970-01-01
        相关资源
        最近更新 更多