ifelse 在行上有条件 [重复]

Posted

技术标签:

【中文标题】ifelse 在行上有条件 [重复]【英文标题】:ifelse with condition on rows [duplicate] 【发布时间】:2017-10-23 15:04:24 【问题描述】:

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

我有以下数据集:

head(data) 

    ID Cond1 
     A   10
     A   10
     B   20
     B   30

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

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

有什么想法吗?

【问题讨论】:

@Jaap 问题不一样(如果你读过的话) @Jaap 实际上,它不是重复的。不过感谢您的负面声誉。 @Prometheus 我只关闭了这个问题;我没有投反对票。现在的问题是,它是重复的。如果您认为不是,请澄清并更新您的问题。 @Jeep 好吧,您指出的问题通常要求删除重复的行。我需要对数据进行分组,并删除特定列中的重复项。这是一个微妙但关键的区别,因为我的原始数据在其他行中包含不应删除的重复项。 @Prometheus 我查看了链接问题的已接受答案,它完全符合您的需要:它只删除特定列的重复项。 【参考方案1】:

我们可以使用n_distinctfilter

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

【讨论】:

【参考方案2】:

您可以像这样使用基本 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")

【讨论】:

以上是关于ifelse 在行上有条件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

没有 else 子句的单行 If 条件 [重复]

sql中的if else条件[重复]

带有布尔条件的 if else 语句中的代码[重复]

php if else条件在变量中作为字符串[重复]

ifelse 按 r 中的列位置 - 列名未知 [重复]

在行中重复的单元格的更改值-R