我有两个看起来像这样的数据框
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)。我该怎么做呢?
答案 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(.) )