【问题标题】:Delete rows in data frame if entry appears fewer than x times如果条目出现少于 x 次,则删除数据框中的行
【发布时间】:2014-10-25 13:56:47
【问题描述】:

我有以下数据框,称为 df,它是一个由三个向量组成的数据框:“姓名”、“年龄”和“邮编”。

df=      
  Name Age ZipCode
1  Joe  16   60559
2  Jim  20   60637
3  Bob  64   94127
4  Joe  23   94122
5  Bob  45   25462

如果df中的Name在整个数据框中出现的次数少于2次(可以灵活地出现3、4或x次),我想删除整行df。数据框中基本保留BobJoe,但删除Jim。我怎样才能做到这一点?

我试着把它变成一张桌子:

> table(df$Name)

Bob Jim Joe 
 2   1   2 

但我不知道从那里去哪里。

【问题讨论】:

    标签: r dataframe duplicate-removal delete-row


    【解决方案1】:

    你可以像这样使用ave

    df[as.numeric(ave(df$Name, df$Name, FUN=length)) >= 2, ]
    #   Name Age ZipCode
    # 1  Joe  16   60559
    # 3  Bob  64   94127
    # 4  Joe  23   94122
    # 5  Bob  45   25462
    

    此答案假定 df$Namecharacter 向量,而不是 factor 向量。


    您也可以继续使用table,如下所示:

    x <- table(df$Name)
    df[df$Name %in% names(x[x >= 2]), ]
    #   Name Age ZipCode
    # 1  Joe  16   60559
    # 3  Bob  64   94127
    # 4  Joe  23   94122
    # 5  Bob  45   25462
    

    【讨论】:

    • 第一个有效,但第二个正是我想要的。非常感谢!
    • @Mlee,没问题。您还可以探索“data.table”包,它可以让您执行以下操作:library(data.table); DT &lt;- data.table(df); DT[, count := .N, by = Name][count &gt;= 2]
    • ...或更短的 data.table 版本,归功于 @mnel - DT[, if(.N &gt;= 2) .SD, by=Name]
    • @thelatemail,不错!
    猜你喜欢
    • 1970-01-01
    • 2012-02-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    相关资源
    最近更新 更多