Свертывание рядов в одно наблюдение (ряд) - PullRequest
0 голосов
/ 17 января 2020

У меня есть набор данных, в которых наблюдения для отдельных людей в отдельные моменты времени разбиты на несколько строк. Мне нужна помощь, чтобы свести эти строки в один ряд. Под свертыванием я подразумеваю заполнение отсутствующих данных из одной строки соответствующими данными из другой строки.

Итак, у меня сейчас есть что-то вроде этого:

# A tibble: 8 x 6
     id assessment measure  data EDE_data HWM_data
  <dbl> <chr>      <chr>   <dbl>    <dbl>    <dbl>
1  4001 A1         NA          1       NA       NA
2  4001 A1         EDE        NA        1       NA
3  4001 A1         HWM        NA       NA        1
4  4001 A2         NA          2       NA       NA
5  4001 A2         EDE        NA        2       NA
6  4002 A1         NA          3       NA       NA
7  4002 A1         EDE        NA        3       NA
8  4002 A1         HWM        NA       NA        3

Но мне нужно, чтобы оно выглядело так:

# A tibble: 3 x 6
     id assessment measure  data EDE_data HWM_data
  <dbl> <chr>      <lgl>   <dbl>    <dbl>    <dbl>
1  4001 A1         NA          1        1        1
2  4001 A2         NA          2        2       NA
3  4002 A1         NA          3        3        3

ИЛИ это:

# A tibble: 3 x 5
     id assessment  data EDE_data HWM_data
  <dbl> <chr>      <dbl>    <dbl>    <dbl>
1  4001 A1             1        1        1
2  4001 A2             2        2       NA
3  4002 A1             3        3        3

Я знаю, что мог бы использовать dplyr::fill здесь, но я не совсем уверен, как это сделать.

1 Ответ

0 голосов
/ 17 января 2020

После группировки по 'id', 'analysis', if все элементы NA return NA или else возвращают первый не-NA элемент. Для «меры» неясно, почему возвращается NA, поэтому столбец изменяется на NA

library(dplyr)
df1 %>%
  mutate(measure = NA) %>%
  group_by(id, assessment) %>%     
  summarise_at(vars(-group_cols()), ~ if(all(is.na(.))) NA else  .[!is.na(.)][1])
# A tibble: 3 x 6
# Groups:   id [2]
#     id assessment measure  data EDE_data HWM_data
#  <int> <chr>      <lgl>   <int>    <int>    <int>
#1  4001 A1         NA          1        1        1
#2  4001 A2         NA          2        2       NA
#3  4002 A1         NA          3        3        3

Или если нам не нужен столбец «мера» select out

df %>%
  select(-measure) %>%
  group_by(id, assessment) %>%
  summarise_at(vars(-group_cols()), ~ if(all(is.na(.))) NA else  .[!is.na(.)][1])

данные

df1 <- structure(list(id = c(4001L, 4001L, 4001L, 4001L, 4001L, 4002L, 
4002L, 4002L), assessment = c("A1", "A1", "A1", "A2", "A2", "A1", 
"A1", "A1"), measure = c(NA, "EDE", "HWM", NA, "EDE", NA, "EDE", 
"HWM"), data = c(1L, NA, NA, 2L, NA, 3L, NA, NA), EDE_data = c(NA, 
1L, NA, NA, 2L, NA, 3L, NA), HWM_data = c(NA, NA, 1L, NA, NA, 
NA, NA, 3L)), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8"))
...