我有以下数据框:
x y z
1 a c 0
2 a c 0
3 a c 1
4 a c 0
5 a c 0
6 b c 0
7 b c 0
8 b c 0
9 b c 1
10 b c 0
11 b c 0
12 b c 0
13 a d 0
14 a d 0
15 a d 0
我想删除列z前一行中有1的行,列x和y中的值相同。例如,对于第10行,我想在行1:9中搜索x =" b",y =" c"和z等于1的行。如果这样的话行存在于行1:9中,我想删除第10行。
因此,生成的数据帧将删除第4,5,10,11和12行:
x y z
1 a c 0
2 a c 0
3 a c 1
4 b c 0
5 b c 0
6 b c 0
7 b c 1
8 a d 0
9 a d 0
10 a d 0
答案 0 :(得分:3)
我们可以使用data.table
library(data.table)
setDT(df1)[-df1[, .I[cummin(c(0, diff(z==1)))<0], .(x, y)]$V1]
# x y z
# 1: a c 0
# 2: a c 0
# 3: a c 1
# 4: b c 0
# 5: b c 0
# 6: b c 0
# 7: b c 1
# 8: a d 0
# 9: a d 0
#10: a d 0
答案 1 :(得分:2)
这是一个基本的R方法,ave
用于分组,interaction
用于构造组,以及一些使用匿名函数的逻辑操作。 as.logical
将ave
的输出(1s和0s)转换为用于替换的逻辑向量。
匿名函数c(1,head(cummin(i != 1), -1))
为每个组的第一个元素返回1,因为它将始终保留。对于余数,我们检查先前的值是否不是1并返回累积最小值,因此任何1的实例将为剩余元素返回0。 head
用于删除最终元素,因为它不是考虑因素的一部分。
df[as.logical(ave(df$z, interaction(df$x, df$y),
FUN=function(i) c(1,head(cummin(i != 1), -1)))), ]
x y z
1 a c 0
2 a c 0
3 a c 1
6 b c 0
7 b c 0
8 b c 0
9 b c 1
13 a d 0
14 a d 0
15 a d 0
答案 2 :(得分:0)
我不确定我是否收到您的问题,但如果您想删除z = 1的所有行,您可以使用
which(nameofdataframe$z != 1)
如果您想要更多参数,可以使用&amp;像这样:
which(nameofdataframe$z != 1 & nameofdataframe$x == "b")
希望这有帮助!