如果一行符合条件,则删除类别的所有行

时间:2017-04-28 21:21:15

标签: r dataframe subset

问题: 如果其中一行在另一列中具有特定值,则我想删除特定类别的所有行(类似于下面链接中的问题)。但是,主要区别在于我希望它只在匹配另一列中的条件时才能工作。

进行练习df

".read": false

所以我的数据框看起来像这样。

prac_df <- data_frame(
subj = rep(1:4, each = 4),
trial = rep(rep(1:4, each = 2), times = 2),
ias = rep(c('A', 'B'), times = 8),
fixations = c(17, 14, 0, 0, 15, 0, 8, 6, 3, 2, 3,3, 23, 2, 3,3)
)

我想删除所有主题2,因为它的值为0,对于一行中的注册列,其值为A.但是我想在不删除主题3的情况下执行此操作,因为即使有一个0它是一行,其中ias列的值为B.

到目前为止我的尝试。

   subj   ias fixations
1     1     A        17
2     1     B        14
3     2     A         0
4     2     B         0
5     3     A        15
6     3     B         0
7     4     A         8
8     4     B         6

然而,如果它在ias列中具有值A,那么它将丢失仅删除它的部分。我试过各种各样的用途&amp;或者如果但我觉得这可能是一种我不知道的聪明而干净的方式。

我的目标是制作这样的df。

new.df <- prac_df[with(prac_df, ave(prac_df$fixations != 0, subj, FUN = all)),]

非常感谢!

相关问题:

R: Remove rows from data frame based on values in several columns

How to remove all rows belonging to a particular group when only one row fulfills the condition in R?

1 个答案:

答案 0 :(得分:4)

我们根据使用filterany

创建的逻辑条件,按'subj'和!进行分组
library(dplyr)
df1 %>%
   group_by(subj) %>%
   filter(!any(fixations==0 & ias == "A"))
#   subj   ias fixations
#  <int> <chr>     <int>
#1     1     A        17
#2     1     B        14
#3     3     A        15
#4     3     B         0
#5     4     A         8
#6     4     B         6

或将all|

一起使用
df1 %>%
   group_by(subj) %>%
   filter(all(fixations!=0 | ias !="A"))

ave

中的base R可以使用相同的方法
df1[with(df1, !ave(fixations==0 & ias =="A", subj, FUN = any)),]

数据

df1 <- structure(list(subj = c(1L, 1L, 2L, 2L, 3L, 3L, 4L, 4L), ias = c("A", 
"B", "A", "B", "A", "B", "A", "B"), fixations = c(17L, 14L, 0L, 
0L, 15L, 0L, 8L, 6L)), .Names = c("subj", "ias", "fixations"), 
class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8"))