2015-09-24 29 views
1

我有一個因子和兩個字符串字符列(國籍)data.frame。這個因素有2662個等級,每個等級代表一個團隊。團隊有多個成員,因此每個級別都有〜6排。循環一個因子的水平和比較一個變量

我想要做的是循環通過團隊的水平,並比較一個成員國籍,看看這個國籍是否存在於任何其他字符欄的級別。當有比賽我想打上1向量,當沒有比賽我想打上2.

插圖變量

Team N1 N2 
1  JPN US 
1  US GER 
1  DNK RUS 
2  … … 
2  … … 

理想的情況下我的代碼將註冊1美國和2 JPN

我見過像分割功能,tapply,等...但我有寫一個匿名函數來達到我想要的目標問題:

tapply(Data, TEAM_ID, function() for (i in N1){if (N1 %in% N2) Identifyingvect <= 1} else {Identifyingvect <= 2}) 
+0

嗨大衛,謝謝你的提示。我試過了,它似乎工作,但是我如何設置值爲true爲false?對不起,我是這個東西的新手! – Lowpar

+0

請參閱下面的答案。 –

回答

1

這庫侖d可能與by解決,但我更喜歡data.table這樣的任務,這些行之間的東西(順便說一下,tapply是一個聚合函數,因此它將無法正常工作分配值每個元素的情況下有N1

library(data.table) 
setDT(Data)[, res := (!N1 %in% N2) + 1L, by = Team] 

老實說,我寧願保持res邏輯,因爲它是兩個更直觀,更易於操作上,雖然以分配2FALSE比賽和1TRUE比賽我不得不尋找非匹配,而不是的比賽,然後添加一個1

+1

完美的作品!你是個天才和紳士!所以res默認設置爲1,如果(!N1%in%N2)爲真,那麼它會添加一個? – Lowpar

+1

「res」沒有默認值。它返回一個「TRUE」/「FALSE」向量,然後通過加1來轉換爲一個整數。就個人而言,如前所述,我認爲只要使用'setDT(Data)[,%N2中的res2:= N1%,by = Team]''你會更好。然後你可以通過'Data [(res2)]'過濾如果你想看到匹配的數據。或者'Data [(!res2)]'如果你想要不匹配的。比'1'和'2' IMO好得多。 –

+0

這是有道理的,再次,我的無知會暗示做更低效的方式。最後一個問題,如果我可以?我將如何修改代碼來檢查N1列是否具有相同的國籍,換句話說,讓我們假設在上面的示例中,第1隊有第四行,在N1中標記爲US,我如何檢查是否在第N1列中的第1隊。 – Lowpar

相關問題