【问题标题】:Merge multiple rows based on single column value基于单列值合并多行
【发布时间】:2018-10-08 15:30:10
【问题描述】:

我有下表:

A  B  C   D    E

1  NA we  are  here
1  hi we  NA   here
1  NA NA  are  there
2  u  NA  are  where

我希望我的输出表是:

A  B   C   D   E
1  hi  we  are here
2  u   NA  are where

我尝试了以下方法:

my_fun <- function(x) x[!is.na(x)]

buildingCopy %>%
  group_by(A) %>%
  summarise_all(funs(my_fun))

报错:

summarise_impl(.data, dots) 中的错误:列 E 的长度必须为 1 (一个汇总值),而不是 3

谁能帮我实现所需的数据框。

【问题讨论】:

  • 您希望它如何对值进行分组,例如在第 1 组中,C 列中有 2 个值不是 na,E 中有 3 个值。R 不知道您要如何聚合这些(堆栈也没有),你能解释一下应该如何选择这些值吗
  • i 列 C,我有相似的值,即“我们”,所以我想要我们,在 C 列中我有 2 个值,即“这里”和“那里”,我想取第一个值,我得到即“这里”
  • 你可以像这样得到第一个非 na 值:my_fun

标签: r dataframe dplyr summarization


【解决方案1】:

您可以通过以下方式修改您的功能:

my_fun <- function(x) {
  if_else(any(!is.na(x)), na.exclude(x)[1], NA_character_)
}

首先检查是否有非缺失值,返回第一个非缺失值,否则返回NA

如果您只使用该功能一次,您也可以这样做:

buildingCopy %>% 
  group_by(A) %>% 
  summarise_all(funs(if_else(any(!is.na(.)), na.exclude(.)[1], NA_character_)))

# A tibble: 2 x 5
#       A B     C     D     E    
#   <dbl> <chr> <chr> <chr> <chr>
# 1     1 hi    we    are   here 
# 2     2 u     NA    are   where

或者您可以在summarise_if-statement 中使用条件:

buildingCopy %>% 
  add_row(A = 2, B = "u", C = NA_character_, D = "are", E = "where") %>% 
  group_by(A) %>% 
  summarise_if(funs(any(!is.na(.))), funs(na.exclude(.)[1]))

# A tibble: 2 x 5
#       A B     C     D     E    
#   <dbl> <chr> <chr> <chr> <chr>
# 1     1 hi    we    are   here 
# 2     2 u     NA    are   where

数据

buildingCopy <- structure(list(A = c(1L, 1L, 1L, 2L), 
                               B = c(NA, "hi", NA, "u"), 
                               C = c("we", "we", NA, NA), 
                               D = c("are", NA, "are", "are"), 
                               E = c("here", "here", "there", "where")), 
                          class = "data.frame", row.names = c(NA, -4L))

【讨论】:

    【解决方案2】:

    这里可以使用基础R函数na.omit()

    library(dplyr)
    my_fun <- function(x) na.omit(x) %>% first()
    buildingCopy %>% 
      group_by(A) %>% 
      summarise_all(funs(my_fun))
    
    # A tibble: 2 x 5
          A B     C     D     E    
      <int> <chr> <chr> <chr> <chr>
    1     1 hi    we    are   here 
    2     2 u     NA    are   where
    

    数据

    buildingCopy <- readr::read_table(
    "A  B  C   D    E
    1  NA we  are  here
    1  hi we  NA   here
    1  NA NA  are  there
    2  u  NA  are  where")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多