R:根据几列中的值从数据框中删除行

R:根据几列中的值从数据框中删除行,r,R,我有以下dataframe(df)-有更多列,但这些是相关列: ID Cost 1 $100 1 $200 2 $50 2 $0 2 $40 3 $10 4 $100 5 $0 5 $50 我想对这个数据帧进行子集划分,这样,如果某个特定ID的任何成本=0美元,那么它应该删除所有这些行(即该特定ID的所有行) 因此,在本例中,ID2和ID5包含$0,因此应该删除ID2和ID5的所有行 以下是我想要的结果df: ID Cost

我有以下dataframe(df)-有更多列,但这些是相关列:

ID  Cost 
1    $100
1    $200
2    $50
2    $0
2    $40
3    $10
4    $100
5    $0
5    $50
我想对这个数据帧进行子集划分,这样,如果某个特定ID的任何成本=0美元,那么它应该删除所有这些行(即该特定ID的所有行)

因此,在本例中,ID2和ID5包含$0,因此应该删除ID2和ID5的所有行

以下是我想要的结果df:

    ID  Cost 
    1    $100
    1    $200
    3    $10
    4    $100
有人能帮忙吗?我尝试了一些
子集
函数的组合,但没有成功

**类似的注意事项:我有另一个带有“NA”的数据帧-如果是NAs,而不是0,您能帮我解决同样的问题吗

提前谢谢

试试看

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

您可以使用类似于
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(例如,“ID的平均成本必须至少为xyz”)。

尝试以下方法:

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

谢谢@josilber!如果我想删除基于NAs的行呢?那么您可以将
sum(x==0)>0
更改为
sum(is.na(x))>0
+1使用
subset
做得很好。您可以使用(df,subset(df,!ID%in%ID[is.na(Cost)| Cost==“$0”])保存击键
数据表选项为<代码>库(data.table);setDT(df)[,如果(!any(Cost='$0')).SD,ID]
  ID Cost
1  1 $100
2  1 $200
6  3  $10
7  4 $100