R код не работает для объединения данных (не дублируется) в столбцах на основе одинаковых значений - PullRequest
2 голосов
/ 11 июня 2019

Я пытаюсь обработать некоторые данные в таблице (фрейме данных), используя dplyr, для дублирования записей, где, если идентификатор появляется дважды, результирующая запись будет содержать одинаковые значения, если все они идентичны, или NA, если есть несоответствие в одной из записей. Например, если у меня есть df:

id       date        amount     tag
---      ----        ------     ---
1        2018-01-03  10         big
2        2019-01-16  20         small
3        2020-01-05  30         big
3        2001-03-04  30         big
1        2018-01-03  5          big

Результат должен выглядеть следующим образом:

id       date        amount     tag
---      ----        ------     ---
1        2018-01-03  NA         big
2        2019-01-16  20         small
3        NA          30         big

Основываясь на других ответах, которые я нашел о переполнении стека, я пробовал различные методы использования summarise_all, включая:

new_df <- df %>% group_by(id) %>% summarise_all(function(x) ifelse(all(x[1] == x),x[1],NA))
new_df <- df %>% group_by(id) %>% summarise_all(list(~ if(all(.[1] == .)) .[1] else NA))
new_df <- df %>% group_by(id) %>% summarise_all(funs(if(all(.[1] == .)) .[1] else NA))

Поскольку я мог использовать ifelse(all(x[1] == x),x[1],NA) сам по себе с вектором, и он работал нормально, я подумал, что это будет работать с summarise_all. Но когда я использую это с summarise_all или другими вариантами, которые я показываю выше, я получаю ошибку:

Error in summarise_impl(.data, dots): Column `date` can't promote group 2 to character

Я подозреваю, что мне просто нужно немного изменить свой код, чтобы он заработал, но я работал над этим весь день, и я не знаю, почему он не работает ... Так что любой помощь, которую может оказать сообщество, будет принята с благодарностью. Я впервые задаю вопрос о переполнении стека, потому что почти всегда могу найти ответ на вопросы других людей :-) Большое спасибо за любую помощь!

1 Ответ

2 голосов
/ 11 июня 2019

Во-первых, решение:

d %>% 
  group_by(id) %>% 
  summarise_all(~if(n_distinct(.) == 1) first(.) else c(NA, .)[1])

Это на самом деле немного сложно. Можно подумать, что можно написать просто:

d %>% 
  group_by(id) %>% 
  summarise_all(~if(n_distinct(.) == 1) first(.) else NA)

Это просто альтернатива вашему if (all ...) ... else ..., использующему еще dplyr функций.

Тем не менее, dplyr не любит просто давать NA, но вам нужно быть привязанным к типу. Например. вам нужно предоставить NA_character_ или NA_integer_ и т. д., чтобы они соответствовали правильному типу данных. Вот почему ваш код терпит неудачу, ошибка говорит о том, что группу 2 (то есть id == 2 в данном случае) не удается «преобразовать» в символ. Это означает, что NA, указанный в столбце Date, не приводится к символу, и новый столбец не может быть создан.

Так как вы не хотите кодировать все правильные NA типы, здесь я использую небольшую хитрость. Использование c(NA, .)[1] для объединения значения NA с исходной переменной приведёт NA к правильному типу, который я затем использую. Вероятно, вы можете использовать другие приемы, чтобы получить правильный NA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...