Использование R для объединения строк во фрейме данных на основе общей переменной - PullRequest
0 голосов
/ 22 мая 2019

Я работаю с несколькими ответами на опрос, и возвращенные данные были отформатированы неловко.Вот пример того, как выглядят данные:

df <- data_frame(Person = c("Person1", "Person1","Person2", "Person2","Person3", "Person3"), Q1 = c(NA, 1, NA, 2, NA, 1), Q2 = c(NA, 3, NA, 2, NA, 4),
             Q3 = c(2, NA, 4, NA, 1, NA), Q4 = c(5, NA, 5, NA, 5, NA))

Это то, с чего я начинаю:

Person     Q1    Q2    Q3    Q4
  <chr>   <dbl> <dbl> <dbl> <dbl>
1 Person1    NA    NA     2     5
2 Person1     1     3    NA    NA
3 Person2    NA    NA     4     5
4 Person2     2     2    NA    NA
5 Person3    NA    NA     1     5
6 Person3     1     4    NA    NA

Это то, что я хотел бы:

Person     Q1    Q2    Q3    Q4
  <chr>   <dbl> <dbl> <dbl> <dbl>
1 Person1     1     3     2     5
2 Person2     2     2     4     5
3 Person3     1     4     1     5

Я бы хотел сделать это с помощью dplyr, но пока мне не повезло.

Ответы [ 2 ]

1 голос
/ 22 мая 2019

Вы можете получить первый не-NA для каждого столбца в каждой группе с помощью coalesce.Нет никакой реальной причины предпочитать это значение по сравнению с na.omit, если только у вас нет> 1 значения, отличного от NA.

library(tidyverse)

df %>% 
  group_by(Person) %>% 
  summarise_all(reduce, coalesce)

# # A tibble: 3 x 5
#   Person     Q1    Q2    Q3    Q4
#   <chr>   <dbl> <dbl> <dbl> <dbl>
# 1 Person1     1     3     2     5
# 2 Person2     2     2     4     5
# 3 Person3     1     4     1     5
1 голос
/ 22 мая 2019

Если у нас есть только один элемент, отличный от NA, на каждый столбец в группе

library(dplyr)
df %>% 
   group_by(Person) %>%
   summarise_all(na.omit)
# A tibble: 3 x 5
#  Person     Q1    Q2    Q3    Q4
#  <chr>   <dbl> <dbl> <dbl> <dbl>
#1 Person1     1     3     2     5
#2 Person2     2     2     4     5
#3 Person3     1     4     1     5

Мы также можем использовать min/max/sum/median/ и т. Д.

df  %>%
     group_by(Person) %>%
      summarise_all(mean, na.rm = TRUE)

или

df %>%
   group_by(Person) %>%
   summarise_all(min, na.rm = TRUE)

Или

df %>%
   group_by(Person) %>%
   summarise_all(median, na.rm = TRUE)

Кроме того, любая из функций, которые удаляют NA и получает элемент first, отличный от NA

df %>%
    group_by(Person) %>%
    summarise_all(list(~.[!is.na(.)]))

Если элементы не-NA больше 1, то либо paste в строке, либо столбец list

df %>% 
    group_by(Person) %>%
    summarise_all(list(~ toString(.[!is.na(.)])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...