我希望按ID对数据进行分组,并根据条件对第一行进行切片。
我有以下数据集:
head(data)
ID Cond1
A 10
A 10
B 20
B 30
现在,我想根据条件切片行:
有什么想法吗?
答案 0 :(得分:3)
您可以像这样使用基本R函数ave
:
datafr[!(ave(datafr$Cond1, datafr$ID, FUN=duplicated)),]
ID Cond1
1 A 10
3 B 20
4 B 30
ave
按ID返回数字向量,如果Cond1的元素重复,则返回1;如果不重复,则返回0。 !
执行两个角色,首先它将结果向量转换为适合子字节的逻辑向量。其次,它会反转结果,保留非重复元素。
在data.table
中,您可以使用加入。
setDT(datafr)[datafr[, !duplicated(Cond1), by=ID]$V1]
ID Cond1
1: A 10
2: B 20
3: B 30
内部data.frame按ID返回不重复元素的逻辑,并通过$V1
拉出到向量中。该逻辑向量被馈送到原始data.table以执行子集化。
数据强>
datafr <-
structure(list(ID = c("A", "A", "B", "B"), Cond1 = c(10L, 10L,
20L, 30L)), .Names = c("ID", "Cond1"), row.names = c(NA, -4L), class = "data.frame")
答案 1 :(得分:2)
我们可以n_distinct
使用filter
library(dplyr)
data %>%
group_by(ID) %>%
filter(n_distinct(Cond1)==n()| row_number()==1)
或者只是
data[!duplicated(data),]
# ID Cond1
#1 A 10
#3 B 20
#4 B 30
根据OP的帖子中的描述,如果我们在B 20
中包含另一行,则第一个解决方案应该给出
data %>%
group_by(ID) %>%
filter(n_distinct(Cond1)==n()| row_number()==1)
# A tibble: 2 x 2
# Groups: ID [2]
# ID Cond1
# <chr> <int>
#1 A 10
#2 B 20