【问题标题】:How to delete groups containing less than 3 rows of data in R? [duplicate]如何删除 R 中包含少于 3 行数据的组? [复制]
【发布时间】:2016-05-18 06:05:47
【问题描述】:

我在 R 中使用 dplyr 包,并将我的数据按 3 个变量(年份、站点、育雏)分组。

我想摆脱由少于 3 行组成的组。例如,在下面的示例中,我想删除 brood '2' 的行。我有很多数据可以做到这一点,所以虽然我可以煞费苦心地手工完成,但使用 R 自动化它会很有帮助。

Year Site Brood Parents
1996 A    1     1  
1996 A    1     1  
1996 A    1     0  
1996 A    1     0  
1996 A    2     1      
1996 A    2     0  
1996 A    3     1  
1996 A    3     1  
1996 A    3     1  
1996 A    3     0  
1996 A    3     1  

我希望这是有道理的,并提前非常感谢您的帮助!我是 R 和 stackoverflow 的新手,如果我对这个问题的措辞不是很好,我深表歉意!如果我需要提供任何其他信息,请告诉我。

【问题讨论】:

  • dplyr 有必要吗?还是 base-R 或 data.table 中的解决方案也合适?
  • @Heroka data %>% group_by(Year, Site, Brood) %>% filter(n() >= 3) 你为什么不使用 dplyr? ;)
  • @Mullefa 因为还有其他选择,而且我个人更喜欢 data.table 和 base-R。但我知道偏好可能因人而异:P
  • @Heroka 我确信其他方法是完全合适的!就像我说我是一个菜鸟,我只是使用 dplyr 比 base-R/data.table 更多:P

标签: r rows


【解决方案1】:

在这里抛出data.table 方法加入派对:

library(data.table)
setDT(my_data)
my_data[ , if (.N >= 3L) .SD, by = .(Year, Site, Brood)]

【讨论】:

    【解决方案2】:

    一种方法是在filter 中使用神奇的n() 函数:

    library(dplyr)
    
    my_data <- data.frame(Year=1996, Site="A", Brood=c(1,1,2,2,2))
    
    my_data %>% 
      group_by(Year, Site, Brood) %>% 
      filter(n() >= 3)
    

    n() 函数给出当前组中的行数(如果没有分组,则为总行数)。

    【讨论】:

    • 这个很棒的答案帮助了我,如果其他人需要它,这里是 n() 的官方 dplyr 文档,因为我很难找到它:dplyr.tidyverse.org/reference/n.html 主要的收获是 n () 可以与 summarise()、mutate() 和 filter() 一起使用
    【解决方案3】:

    您也可以使用基础 R 来做到这一点:

    temp <- read.csv(paste(folder,"test.csv", sep=""), head=TRUE, sep=",")
    matches <- aggregate(Parents ~ Year + Site + Brood, temp, FUN="length")
    temp <- merge(temp, matches, by=c("Year","Site","Brood"))
    temp <- temp[temp$Parents.y >= 3, c(1,2,3,4)]
    

    【讨论】:

    • 或者在一个非常丑陋的oneliner中:dat[unlist(sapply(split(dat,list(dat$Year,dat$Site,dat$Brood)),function(x){rep(nrow(x),nrow(x))}))&gt;3,]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多