比较两个数据框以查找在一定范围内缺失的值

3

我有以下两个数据框:

a1 <- data.frame(count = 1:10, site = "a")
a2 <-data.frame(count = 2:8, site = "b")
a4 <- data.frame(count = c(3,6,7,9), site = "a")
a5 <- data.frame(count = c(3,5,7), site = "b")
data1 <- rbind(a1, a2)
data2 <- rbind(a4, a5)

我希望生成一个数据框,列出基于“count”列在data2中未找到的data1中的行。有许多方法可以做到这一点,例如:

method1 <- rbind(data1, data2)
method1[!duplicated(method1,fromLast = FALSE)&!duplicated(method1,fromLast = TRUE),] 

这将返回:

   count site
1      1    a
2      2    a
4      4    a
5      5    a
8      8    a
10    10    a
11     2    b
13     4    b
15     6    b
17     8    b

或者是类似这样的东西(作为一个旁问,这行代码没有完美地工作,如果您有任何想法,我将不胜感激,因为我已经在其他几个数据处理步骤中使用了这个命令)。
method2 <- data1[!data1$count %in% data2$count,]

无论如何,主要问题是:我如何仅返回data2计数范围内缺失的行?也就是说,我希望输出为:
   count site
4      4    a
5      5    a
8      8    a
13     4    b
15     6    b

我有数百个数据框,每个数据框都包含许多具有高度可变范围的站点。
这是我第一次发布问题,感谢您花时间阅读我的问题,我欣赏任何建议的解决方案。
2个回答

2

我觉得他做了你想要的事情,即“根据列‘count’在data2中未找到的列在data1中进行列表显示”:

method2 <- data1[!data1$count %in% data2$count,]
result <- subset(method2, method2$count > min(data2$count) & 
                 method2$count < max(data2$count))

您的代码
method2 <- data1[!data1$count %in% data2$count,]

这段代码实现了它应该实现的功能,但是看起来你不仅想基于 count 排除变量,还想基于 countsite 的组合来排除变量...?

编辑:好的,看起来你确实想考虑站点,而不仅仅是计数。在这种情况下,这就是你想要的吗?

method2 <- data1[! interaction(data1$count, data1$site) %in%
                     interaction(data2$count,data2$site),]
result <- subset(method2, method2$count > min(data2$count) & 
               method2$count < max(data2$count))

编辑2:现在这些值都在每个站点定义的范围内。

method2[apply(method2, 1, function(x)  
                 as.numeric(x["count"]) > min(data2$count[data2$site == x["site"]]) &
                 as.numeric(x["count"]) < max(data2$count[data2$site == x["site"]]) )
        ,]

谢谢您的回复。这很接近,但是method2对于A站点没有返回5,对于B站点也没有返回6。而且子集范围需要针对每个站点具体指定(A站点范围为3-9,B站点范围为3-7)。因此,也许我需要一些应用函数来获取每个站点的特定范围? - user3071282
谢谢再次查看!Method2看起来很棒。唯一的问题是,结果考虑了所有data2中“count”的范围。我希望子集范围也能针对每个站点具体指定。交互作用在这里也适用吗? - user3071282
非常好!感谢您花时间完善答案(和问题!) - user3071282

0

你能做类似这样的事情吗:

data1[ setdiff(data1$count, data2$count),]

这不是返回 data1 中不在 data2 中的行吗?


如果计数变量不按顺序排列,这种解决方案并不完全可行。此外,该解决方案也无法返回数据1中符合条件的第11、13和17行,因为它们的“count”值在“data2$count”中找不到。 - sparrow

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