【问题标题】:R: Remove rows from data frame based on values in several columnsR:根据几列中的值从数据框中删除行
【发布时间】:2015-06-09 16:44:00
【问题描述】:

我有以下数据框 (df) - 还有更多列,但这些是相关列:

ID  Cost 
1    $100
1    $200
2    $50
2    $0
2    $40
3    $10
4    $100
5    $0
5    $50

我想对这个数据框进行子集化,这样如果特定 ID 的任何成本 = $0,那么它应该删除所有这些行(即该特定 ID 的所有行。)

因此,在此示例中,ID 2 和 5 包含 $0,因此应删除 ID 2 和 ID 5 的所有行。

这是我想要的结果df:

    ID  Cost 
    1    $100
    1    $200
    3    $10
    4    $100

有人可以帮忙吗?我尝试了subset 函数的一些组合,但没有奏效。

** 类似的说明:我有另一个带有“NA”的数据框 - 你能帮我找出同样的问题,以防它是 NA,而不是 0。

提前致谢!!

【问题讨论】:

  • 一个 data.table 选项是。 library(data.table); setDT(df)[, if(!any(Cost=='$0')) .SD, ID]

标签: r


【解决方案1】:

试试这个:

subset(df,!df$ID %in% df$ID[is.na(df$Cost) | df$Cost == "$0"])

这给了你:

  ID Cost
1  1 $100
2  1 $200
6  3  $10
7  4 $100

【讨论】:

  • +1 使用subset 做得很好。你可以用with(df, subset(df,!ID %in% ID[is.na(Cost) | Cost == "$0"]))保存击键
【解决方案2】:

试试

df[!df$ID %in% df$ID[df$Cost=="$0"],]

【讨论】:

    【解决方案3】:

    您可以使用 tapply 之类的方式计算要删除的 ID:

    (has.zero <- tapply(df$Cost, df$ID, function(x) sum(x == 0) > 0))
    #     1     2     3     4     5 
    # FALSE  TRUE FALSE FALSE  TRUE 
    

    然后您可以进行子集化,限制为您不想删除的 ID:

    df[!df$ID %in% names(has.zero)[has.zero],]
    #   ID Cost
    # 1  1  100
    # 2  1  200
    # 6  3   10
    # 7  4  100
    

    这非常灵活,因为它使您能够根据更复杂的条件限制 ID(例如“ID 的平均成本必须至少为 xyz”)。

    【讨论】:

    • 感谢@josilber!如果我想删除基于 NA 的行怎么办?
    • 那你要把sum(x == 0) &gt; 0改成sum(is.na(x)) &gt; 0。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 2022-08-03
    • 1970-01-01
    相关资源
    最近更新 更多