R:根据几列中的值从数据框中删除行
我有以下dataframe(df)-有更多列,但这些是相关列: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
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