根据多个先前行/列

时间:2017-04-28 15:29:30

标签: r dataframe

我有以下数据框:

   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

3 个答案:

答案 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.logicalave的输出(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")

希望这有帮助!