我有以下数据集,其中 ID 有重复项,其他列是范围从 0 t0 2 的分类列。如果可用,我想选择其他列的值不为零的唯一 ID。数据如下:
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
谢谢!
答案 0 :(得分:4)
我们可以在 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)
这是一个 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