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_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
【讨论】:
【参考方案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 在行上有条件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章