我想通过从数据框中的变量中删除行来创建一个新的数据集,该行的另一个变量的每个级别的最后值均为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
答案 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")