ifelse与行上的条件

时间:2017-05-23 15:05:42

标签: r if-statement data.table dplyr

我希望按ID对数据进行分组,并根据条件对第一行进行切片。

我有以下数据集:

head(data) 

    ID Cond1 
     A   10
     A   10
     B   20
     B   30

现在,我想根据条件切片行:

  • 如果Cond1中的值对于两行都是唯一的,请保留它们;
  • 如果Cond1中的值重复,请保留顶行。

有什么想法吗?

2 个答案:

答案 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