我有一个数据框,例如:
sub day
1 1
1 2
1 3
1 4
2 1
2 2
2 3
2 4
3 1
3 2
3 3
3 4
Run Code Online (Sandbox Code Playgroud)
我想删除可以通过sub和day的组合识别的特定行.例如,我想删除sub ='1'和day ='2'以及sub = 3和day ='4'的行.我怎么能这样做?我意识到我可以指定行号,但这需要应用于一个巨大的数据帧,这将是繁琐的经历和ID每一行.
42-*_*42- 35
DF[ ! ( ( DF$sub ==1 & DF$day==2) | ( DF$sub ==3 & DF$day==4) ) , ] # note the ! (negation)
Run Code Online (Sandbox Code Playgroud)
或者,如果sub是您使用引号建议的因素:
DF[ ! paste(sub,day,sep="_") %in% c("1_2", "3_4"), ]
Run Code Online (Sandbox Code Playgroud)
也可以使用子集:
subset(DF, ! paste(sub,day,sep="_") %in% c("1_2", "3_4") )
Run Code Online (Sandbox Code Playgroud)
(我支持which在使用"["时使用Dirk的答案,即使有些人声称不需要它.)
Dir*_*tel 16
这归结为两个不同的步骤:
which()data.frame通过排除上一步中的索引来创建更新.这是一个例子:
R> set.seed(42)
R> DF <- data.frame(sub=rep(1:4, each=4), day=sample(1:4, 16, replace=TRUE))
R> DF
sub day
1 1 4
2 1 4
3 1 2
4 1 4
5 2 3
6 2 3
7 2 3
8 2 1
9 3 3
10 3 3
11 3 2
12 3 3
13 4 4
14 4 2
15 4 2
16 4 4
R> ind <- which(with( DF, sub==2 & day==3 ))
R> ind
[1] 5 6 7
R> DF <- DF[ -ind, ]
R> table(DF)
day
sub 1 2 3 4
1 0 1 0 3
2 1 0 0 0
3 0 1 3 0
4 0 2 0 2
R>
Run Code Online (Sandbox Code Playgroud)
我们看到sub==2只剩下一个条目了day==1.
编辑复合条件可以使用'或'完成,如下所示:
ind <- which(with( DF, (sub==1 & day==2) | (sub=3 & day=4) ))
Run Code Online (Sandbox Code Playgroud)
这是一个新的完整例子
R> set.seed(1)
R> DF <- data.frame(sub=rep(1:4, each=5), day=sample(1:4, 20, replace=TRUE))
R> table(DF)
day
sub 1 2 3 4
1 1 2 1 1
2 1 0 2 2
3 2 1 1 1
4 0 2 1 2
R> ind <- which(with( DF, (sub==1 & day==2) | (sub==3 & day==4) ))
R> ind
[1] 1 2 15
R> DF <- DF[-ind, ]
R> table(DF)
day
sub 1 2 3 4
1 1 0 1 1
2 1 0 2 2
3 2 1 1 0
4 0 2 1 2
R>
Run Code Online (Sandbox Code Playgroud)
这是使用dplyrfilter函数解决问题的方法.
虽然您可以将数据帧作为第一个参数传递给任何dplyr函数,但我使用了它的%>%运算符,它将数据帧传递给一个或多个dplyr函数(在这种情况下只是过滤).
一旦你对dplyr有点熟悉,那么备忘单非常方便.
> print(df <- data.frame(sub=rep(1:3, each=4), day=1:4))
sub day
1 1 1
2 1 2
3 1 3
4 1 4
5 2 1
6 2 2
7 2 3
8 2 4
9 3 1
10 3 2
11 3 3
12 3 4
> print(df <- df %>% filter(!((sub==1 & day==2) | (sub==3 & day==4))))
sub day
1 1 1
2 1 3
3 1 4
4 2 1
5 2 2
6 2 3
7 2 4
8 3 1
9 3 2
10 3 3
Run Code Online (Sandbox Code Playgroud)