2013-05-13 89 views
1

我似乎無法通過搜索找到答案。我想選擇基於四個條件data.frame的一個子集(lon1lon2LAT1LAT2)。我已經向量化了巨大的相似矩陣和網站(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組合我需要一個更大的子集。我假設%in%中的匹配函數只能匹配一個向量。所以,它的匹配條件1 &條件2 & condition3 & condition4,因此是返回一個結果,給出了一個子集是一樣的原單out1。當所有四個值與該行相同時,我只想得到這種情況。這樣我會得到的數據的一個子集爲兩兩相異我很感興趣。

如何通過基於四個變量的一個獨特的組合行子集將不勝感激任何想法。

+0

你可以更具體,我不明白,因爲所有的4個條件是相同的在你的情況。 「測試」你的預期產出? – Nishanth 2013-05-13 09:19:27

+0

@ e4e5f4,他希望整行匹配。通過做單獨的比較和他們,你可以得到所有可能的組合,不一定是連續的相同元素。這與[這個問題(我們都回答了這個問題)**](http:// stackoverflow。問題/ 16398420 /子集的數據幀在r) – Arun 2013-05-13 09:30:27

回答

2

我認爲這是你在找什麼。基本上你想要duplicated函數返回你所期望的。

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

它是如何工作的?首先我們rbindout2out1。然後撥打duplicated就可以了。這是out2out1列將被標記爲out1TRUE。這是因爲第一次出現在out2上,並且在那裏沒有重複。但第二次發現該條目時,它將在out1中,所以它會知道以前有一排完全一樣。所以,它會將其標記爲重複。我們現在有所有重複的條目。由此我們通過去除n = nrow(out1)中的第一個n元素僅子集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 
+0

嗨,大家好,感謝您的及時答案。這看起來很有希望,但我仍然有幾個問題。我試圖從400個站點(dist =(400 * 399)/ 2 = 79800 rows)中提取不相似度,但我只使用上述方法返回了38528行。任何想法爲什麼這可能會發生?重複處理否定嗎?親切的問候,跳過。 – Skiptoniam 2013-05-13 22:58:43

+0

Skiptoniam,如果您提供了一個可重複使用的小例子,那麼這段代碼的位置並不像編輯您的帖子所預期的那樣,我很樂意提供幫助。 – Arun 2013-05-13 23:11:19

+0

嗨,阿倫,我已經想通了。代碼不起作用,因爲我按不同的行順序創建了不同的子集。一旦我按照緯度(而不是經度)排序了不相似性,那麼唯一的組合就會匹配,並返回79800行。謝謝你的幫助。 – Skiptoniam 2013-05-13 23:48:34

相關問題