按照两个数据框中共同的分组合并数据框

3
我有两个龙虾卵大小数据集,由不同的取样器采集,用于评估测量变异性。每个取样器从许多龙虾中测量约50个龙虾卵。然而,偶尔会有一些龙虾只被处理了一个取样器,而另一个取样器则没有。我想将两个取样器的数据合并成一个新数据集,但删除仅由一个取样器处理的龙虾的所有数据。我已经尝试过使用dplyr和semi_join以及intersect,但需要在数据集1->2和2<-1之间执行匹配。我能创建一个新数据集,它可以将两个取样器的行绑定在一起,但不清楚如何从新数据集中删除两个数据集之间的唯一龙虾ID。
这是我的数据的简化版本,其中有从多个龙虾中进行多次卵区域测量的情况,但采样不总是重叠(即,个体只由一个采样器测量而不是另一个采样器)。
install.packages(dplyr)
library(dplyr)

sampler1 <- data.frame(LobsterID=c("Lobster1","Lobster1","Lobster2",
                                   "Lobster2","Lobster2","Lobster2",
                                   "Lobster2","Lobster3","Lobster3","Lobster3"),
                       Area=c(.4,.35,1.1,1.04,1.14,1.1,1.05,1.7,1.63,1.8),
                       Sampler=c(rep("Sampler1", 10)))
sampler2 <- data.frame(LobsterID=c("Lobster1","Lobster1","Lobster1",
                                   "Lobster1","Lobster1","Lobster2",
                                   "Lobster2","Lobster2","Lobster4","Lobster4"),
                       Area=c(.41,.44,.47,.43,.38,1.14,1.11,1.09,1.41,1.4),
                       Sampler=c(rep("Sampler2", 10)))

combined <- bind_rows(sampler1, sampler2)

desiredresult <- combined[-c(8, 9, 10, 19, 20), ]

脚本的底线是从模拟数据中得到的期望结果。我希望将其限制在基础R或dplyr的使用范围内。
5个回答

6
sampler1 %>% rbind(sampler2) %>% filter(LobsterID %in% intersect(sampler1$LobsterID, sampler2$LobsterID))

2
combined <- bind_rows(sampler1, sampler2)


Lobsters.2.sample <- as.character(unique(sampler1$LobsterID)[unique(sampler1$LobsterID) %in% unique(sampler2$LobsterID)])

combined <- combined[combined$LobsterID %in% Lobsters.2.sample,]

2
使用基础的R
combined <-rbind(sampler1, sampler2)
inBoth <- intersect(sampler1[["LobsterID"]], sampler2[["LobsterID"]])
output <- combined[combined[["LobsterID"]] %in% inBoth, ]

intersect函数可以找到两个向量的交集,即在两个样本中都出现过的龙虾。由于所有函数都是矢量化的,因此它应该运行得相当快。


1
将行绑定、分组,并按每个组中不同采样器的数量进行过滤:
sampler1 %>% bind_rows(sampler2) %>% 
    group_by(LobsterID) %>% 
    filter(n_distinct(Sampler) == 2)

## Source: local data frame [15 x 3]
## Groups: LobsterID [2]
## 
##    LobsterID  Area  Sampler
##        <chr> <dbl>    <chr>
## 1   Lobster1  0.40 Sampler1
## 2   Lobster1  0.35 Sampler1
## 3   Lobster2  1.10 Sampler1
## 4   Lobster2  1.04 Sampler1
## 5   Lobster2  1.14 Sampler1
## 6   Lobster2  1.10 Sampler1
## 7   Lobster2  1.05 Sampler1
## 8   Lobster1  0.41 Sampler2
## 9   Lobster1  0.44 Sampler2
## 10  Lobster1  0.47 Sampler2
## 11  Lobster1  0.43 Sampler2
## 12  Lobster1  0.38 Sampler2
## 13  Lobster2  1.14 Sampler2
## 14  Lobster2  1.11 Sampler2
## 15  Lobster2  1.09 Sampler2

1
这里有一种使用 data.table 的选项。使用 rbindlist 来绑定数据集,按 'LobsterID' 进行分组,并使用基于 'Sampler' 中唯一元素数量的逻辑条件来子集化行,即等于 2。
library(data.table)
rbindlist(list(sampler1, sampler2))[, if(uniqueN(Sampler)==2) .SD , by = LobsterID]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接