【问题标题】:ifelse with condition on rows [duplicate]ifelse 在行上有条件 [重复]
【发布时间】: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 我查看了链接问题的已接受答案,它完全符合您的需要:它只删除特定列的重复项。

标签: r if-statement data.table dplyr


【解决方案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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      相关资源
      最近更新 更多