繁体   English   中英

基于多种条件的唯一组合的子集数据帧

[英]Subset data frame based on unique combination of multiple conditions

我似乎无法通过搜索在SO上找到答案。 我试图基于四个条件( lon1lon2lat1lat2 )选择data.frame的子集。 我有一个已经向量化的巨大差异矩阵,并且站点( lon1lon2lat1lat2cbind到该cbind 这是一个示例数据帧:

out1 <- data.frame(lon1 = sample(1:10), lon2 = sample(1:10), 
                   lat1 = sample(1:10), lat2 = sample(1:10), 
                   dissimilarity = sample(seq(0,1,.1),10))
> out1
     lon1   lon2    lat1 lat2 dissimilarity
1     2      6      4      4           0.6
2     4      2      1      3           1.0
3    10      9      2      6           0.0
4     3      1     10      8           0.5
5     9      5      9      1           0.8
6     5      7      5      9           0.9
7     1      8      6      7           0.2
8     8      3      8      5           0.7
9     7      4      3     10           0.3
10    6     10      7      2           0.1

out2 <- out1[c(2,5,6,8),]

   lon1 lon2 lat1 lat2 dissimilarity
1     4   2   1      3           1.0
2     9   5   9      1           0.8
3     5   7   5      9           0.9
4     8   3   8      5           0.7

我尝试以这种方式几次使用%in%函数:

test <- out1[(out1$lon1 %in% out2$lon1) & (out1$lon2 %in% out2$lon2) & 
             (out1$lat1 %in% out2$lat1) & (out1$lat2 %in% out2$lat2), ]

这似乎适用于我在此处提供的基本示例。 但是,当我把它应用到我的巨大的数据帧(与许多latlons重复)我回来,比我需要unqiue组合较大的子集。 我认为是因为%in%的match函数只能匹配一个向量。 因此它与condition1 & condition2 & condition3 & condition4匹配,因此返回的结果给出的子集与原始out1相同。 我只想得到该行的所有四个值都相同的情况。 这样,我将获得我感兴趣的成对差异的数据子集。

任何有关如何基于四个变量的唯一组合逐行子集的任何想法将不胜感激。

我认为这就是您要寻找的。 基本上,您需要duplicated函数以返回期望的结果。

out1[duplicated(rbind(out2, out1)[, 1:4])[-seq_len(nrow(out2))], ]

它是如何工作的? 首先,我们分别rbind out2out1 然后调用duplicated就可以了。 这是中的列out2out1将被标记为TRUEout1 这是因为第一次出现在out2 ,并且在那里没有重复。 但是第二次找到条目时,它将位于out1 ,因此它将知道之前确实有这样的行。 因此,它将标记为重复。 现在,我们有所有重复的条目。 通过删除前n元素(其中n = nrow(out1)我们由此仅对out1的元素进行了子集化。 然后我们在out1上使用此逻辑向量进行子集化。

您可以按照以下说明进行操作,并逐步运行代码以进行后续操作。 这是一个分解版本,用于确定逻辑。

tt <- rbind(out2, out1)
tt.dup <- duplicated(tt[, 1:4)] # marks all duplicate rows in out1 from 1st 4 cols
tt.dup <- tt.dup[-seq_len(nrow(out2))] # remove all out2 entries (first n)
out1[tt.dup, ] # index only TRUE/duplicated elements from out1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM