1

我似乎无法通过在 SO 上的搜索找到答案。data.frame我正在尝试根据四个条件(lon1lon2lat1lat2)选择 a 的子集。我有一个巨大的相异矩阵,它已经被矢量化,并且它的站点(lon1lon2lat1lat2cbind。这是一个示例数据框:

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组合更大。我假设是因为 match 函数%in%只能匹配一个向量。所以它匹配 condition1 &condition2 &condition3 &condition4 并因此返回一个结果,它给出了一个与原始相同的子集out1。我只想得到该行的所有四个值都相同的情况。这样,我将获得我感兴趣的成对差异的数据子集。

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

4

1 回答 1

2

我想这就是你要找的。基本上你想要duplicated返回你所期望的函数。

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

它是如何工作的?首先我们rbind out2out1. 然后调用duplicated它。inout2和 in的列out1将标记为TRUEin out1。这是因为第一次出现是打开的out2,并且它没有在那里重复。但是第二次找到该条目时,它会在out1其中,因此它会知道之前有过一排完全相同的行。因此,它会将其标记为重复。我们现在有所有重复的条目。由此,我们out1通过删除第一个n元素 where仅对 的元素进行子集化n = nrow(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
于 2013-05-13T09:12:33.860 回答