根据另一个数据框中的2个变量删除一个数据框中的行

时间:2019-01-30 18:50:43

标签: r

我有一个包含样品情节信息的数据帧,其中一些样地已经通过不同的条件细分。我的问题是如何根据需要删除的图和条件列表删除一些细分行?

我尝试使用此R-1, GA Block, Sector III, Salt Lake City, Kolkata, West Bengal 700106, India以及dplyr软件包中的filter()函数使用更类似的变体。但是,这只会删除df2中列出的所有图解/条件。

这是我的数据的简化版本:

df3 <- df[!(df$PLOT %in% df2$PLOT & df$CONDID %in% df2$CONDID),]

和我试图用它来删除某些情节/条件看起来名单如下:

df <- data.frame(PLOT = c(82708, 88503, 88503, 88503, 86560, 89773, 82199, 82199, 84113), 
             CONDID = c(1, 1, 2, 3, 1, 1, 1, 2, 1))
df

我希望我的输出数据框看起来像这样:

df2 <- data.frame(PLOT = c(88503, 88503, 82199), CONDID = c(1, 3, 2))
df2

2 个答案:

答案 0 :(得分:1)

您可以使用联接解决此问题:

library(dplyr)
df3<- anti_join(df,df2, by=c("PLOT","CONDID"))

答案 1 :(得分:0)

您建议的代码似乎可以与filter()一起使用。

df %>% 
  filter(!(PLOT %in% df2$PLOT & CONDID %in% df2$CONDID))

#    PLOT CONDID
# 1 82708      1
# 2 88503      1
# 3 86560      1
# 4 89773      1
# 5 82199      1
# 6 84113      1

如果不确定,可以逐步取消该过程:

df %>% 
  mutate(
    condition1 = PLOT %in% df2$PLOT,
    condition2 = CONDID %in% df2$CONDID,
    cond_1_2   = condition1 * condition2
  ) %>% 
  filter(
    cond_1_2 != 1
  ) 

#    PLOT CONDID condition1 condition2 cond_1_2
# 1 82708      1      FALSE      FALSE        0
# 2 88503      1       TRUE      FALSE        0
# 3 86560      1      FALSE      FALSE        0
# 4 89773      1      FALSE      FALSE        0
# 5 82199      1       TRUE      FALSE        0
# 6 84113      1      FALSE      FALSE        0