根据单独的数据帧删除数据框行

时间:2015-12-06 00:27:19

标签: r

我有两个看起来像这样的数据框

interactions <-data.frame(predator=c('A','A','B','B','C'),Prey=c('A','B','C','D','D'))

site.species <- data.frame(species=c('B','C','D'))

> interactions
  predator Prey
1        A    A
2        A    B
3        B    C
4        B    D
5        C    D

> site.species
  species
1       B
2       C
3       D

我想删除交互数据框中具有未包含在site.species数据框中的术语的所有行(在本例中为行1和2)。我该怎么做呢?

3 个答案:

答案 0 :(得分:2)

我们可以确定interactions的值是否为site.species数据框的成员,并带有以下内容 -

(ss <- sapply(interactions, "%in%", site.species$species))
#      predator  Prey
# [1,]    FALSE FALSE
# [2,]    FALSE  TRUE
# [3,]     TRUE  TRUE
# [4,]     TRUE  TRUE
# [5,]     TRUE  TRUE

这给了我们一个逻辑矩阵,我们可以用它来检查。当行和为2(interactions的列数)时,我们知道该行中的所有值都在site.species数据框中。

rowSums(ss) == 2
# [1] FALSE FALSE  TRUE  TRUE  TRUE

我们可以将它用于我们的子集。

interactions[rowSums(ss) == 2, ]
#   predator Prey
# 3        B    C
# 4        B    D
# 5        C    D

答案 1 :(得分:1)

或者我们可以使用&%in%

interactions[with(interactions, predator %in% site.species[[1]] & 
             Prey %in% site.species[[1]]),]

答案 2 :(得分:0)

您可以通过重塑来完成此操作。

library(dplyr)
library(tidyr)

interactions %>%
  mutate(ID = 1:n() ) %>%
  gather(role, species, -ID) %>%
  right_join(site.species) %>%
  spread(role, species) %>%
  filter(complete.cases(.) )