Объединить несколько строк на основе значения одного столбца - PullRequest
0 голосов
/ 08 октября 2018

У меня следующая таблица:

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, точки): столбец E должен иметь длину 1 (итоговое значение), а не 3

Может кто угоднопомогите мне достичь требуемого фрейма данных.

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Здесь может использоваться базовая функция 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")
0 голосов
/ 08 октября 2018

Вы можете изменить свою функцию следующим образом:

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 -статем:

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))
...