Выбор отдельных значений столбца с определенными значениями других столбцов

#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