#r #dplyr #group-by #duplicates
#r #dplyr #групповое-по #дубликаты
Вопрос:
У меня есть следующий набор данных, где ID имеет дубликаты, а другие столбцы представляют собой категориальные столбцы в диапазоне от 0 до 0 2. Я хотел бы выбрать уникальные идентификаторы со значениями других столбцов, которые не равны нулю, если таковые имеются. Данные следующие:
ID X Y R Z
1 0 2 0 1
1 0 2 0 0
2 1 0 0 1
3 1 1 0 1
3 1 1 1 1
4 0 0 1 0
4 0 1 1 0
Мой любимый результат — это:
ID X Y R Z
1 0 2 0 1
2 1 0 0 1
3 1 1 1 1
4 0 1 1 0
Я использую dplyr и group_by
Спасибо!
Комментарии:
1. Базовый вариант
aggregate(. ~ ID, df1, max)
Ответ №1:
Мы можем использовать условие с if/else
после group_by
library(dplyr)
df1 %>%
group_by(ID) %>%
summarise(across(everything(), ~ if(all(. == 0)) 0
else unique(.[. !=0])), .groups = 'drop')
-вывод
# A tibble: 4 x 5
# ID X Y R Z
# <int> <dbl> <dbl> <dbl> <dbl>
#1 1 0 2 0 1
#2 2 1 0 0 1
#3 3 1 1 1 1
#4 4 0 1 1 0
данные
df1 <- structure(list(ID = c(1L, 1L, 2L, 3L, 3L, 4L, 4L), X = c(0L,
0L, 1L, 1L, 1L, 0L, 0L), Y = c(2L, 2L, 0L, 1L, 1L, 0L, 1L), R = c(0L,
0L, 0L, 0L, 1L, 1L, 1L), Z = c(1L, 0L, 1L, 1L, 1L, 0L, 0L)),
class = "data.frame", row.names = c(NA,
-7L))
Комментарии:
1. спасибо, я могу принять ваш ответ через несколько минут. Я попробую ваш код и буду на связи, еще раз спасибо
2. @ akrun, не могли бы вы, пожалуйста, объяснить часть внутри summarise?
3. @akrun. Я получаю сообщение об ошибке, потому что оно есть
unexpected bracket and unexpected comma
вsummarise
части4. @Alex Я снова протестировал код. Извините, не удалось получить указанную вами ошибку. Это потому, что у вас разные
packageVersion('dplyr')
Ответ №2:
Вот data.table
вариант
setDT(df)[, .SD[which.max(rowSums(.SD != 0))], ID]
что дает
ID X Y R Z
1: 1 0 2 0 1
2: 2 1 0 0 1
3: 3 1 1 1 1
4: 4 0 1 1 0