使用循环从具有多个条件的数据帧中删除行

时间:2019-09-17 04:55:18

标签: r

我有一个当前看起来像这样的数据框:

     ID    Freq
     A     10
     B     
     A
     G     6
     B     11
     C     6
     C     7
     D     
     E

我追求的数据帧是这样的:

     ID    Freq
     A     10
     G     6
     B     11
     C     6
     C     7
     D     
     E

我当前正在尝试编写一个循环,该循环标识ID列中的重复项,然后删除带有空白Freq值的重复行。如果存在重复的ID,并且两个都在Freq中有值,那么我不想删除它们。我从哪里开始呢?我会使用duplicated函数来识别重复项吗?

编辑:编辑该操作以添加一些行,以表明如果ID不重复,我想保留空白的Freq值。

1 个答案:

答案 0 :(得分:3)

仅当行多于1个时,您才可以group_by IDfilter组。

library(dplyr)
df %>%
  group_by(ID) %>%
  filter(if(n() > 1) Freq != "" else TRUE)

#  ID    Freq 
#  <fct> <chr>
#1 A     10   
#2 G     6    
#3 B     11   
#4 C     6    
#5 C     7    
#6 D     ""   
#7 E     ""  

在基数R中,我们可以使用ave

subset(df, ave(Freq != "", ID, FUN = function(x) if(length(x) > 1) x else TRUE))

对于更新后的请求,我们可以添加空白值检查以仅选择其中之一。

df %>%
  group_by(ID) %>%
  filter(if(n() > 1) Freq != "" | !duplicated(Freq == "") else TRUE)