R根据其他列中的条件删除零

时间:2020-04-23 14:09:27

标签: r

我想通过从数据框中的变量中删除行来创建一个新的数据集,该行的另一个变量的每个级别的最后值均为0。示例:

set.seed(100)

ID<-rep(1:20, each=5)
ID

var1<-sample(c(0, 1,2, 3), size = 100, replace = TRUE, prob = c(0.6,0.1, 0.1, 0.1))
var1
df <- data.frame(ID,var1)
head(df,15)

   ID var1
1   1    0
2   1    3
3   1    0
4   1    3
5   1    1
6   2    0
7   2    0
8   2    1
9   2    0
10  2    0
11  3    1
12  3    0
13  3    2
14  3    0
15  3    0

变量“ ID”有20个级别,对于每个级别的ID,我都希望从数据帧中删除以0结尾的行。例如,第5行中ID 1的最后一行的值为1,因此应保留。 我们看到ID 2和3在var1的行9、10和14、15中具有0,因此应将其删除。如果我们查看ID 16,则var1的全为0,应将其从新数据帧中完全删除。因此,为了澄清一下,只要var1不是每个ID级别的最后一个值(如果是),则var1是可以的,无论我们要讨论多少行,都应删除包含它们的行。 新的数据框应如下所示。

   ID var1
1   1    0
2   1    3
3   1    0
4   1    3
5   1    1
6   2    0
7   2    0
8   2    1
9   3    1
10  3    0
11  3    2

2 个答案:

答案 0 :(得分:2)

尝试:

library(dplyr)

df %>%
  group_by(ID) %>%
  filter(!(var1 == 0 & cumsum(var1 != 0) == max(cumsum(var1 != 0))))

输出:

# A tibble: 11 x 2
# Groups:   ID [3]
      ID  var1
   <int> <int>
 1     1     0
 2     1     3
 3     1     0
 4     1     3
 5     1     1
 6     2     0
 7     2     0
 8     2     1
 9     3     1
10     3     0
11     3     2

您的初始数据帧代码似乎有问题,因此我只使用了您显示的行,但无论如何应该可以工作。

答案 1 :(得分:1)

使用data.table的选项:

DT[-DT[, {
    ri <- rleid(var1)
    .I[var1==0L & ri==ri[.N]]
}, ID]$V1]

输出:

    ID var1
 1:  1    0
 2:  1    3
 3:  1    0
 4:  1    3
 5:  1    1
 6:  2    0
 7:  2    0
 8:  2    1
 9:  3    1
10:  3    0
11:  3    2

数据:

library(data.table)
DT <- fread("ID var1
1    0
1    3
1    0
1    3
1    1
2    0
2    0
2    1
2    0
2    0
3    1
3    0
3    2
3    0
3    0")