2012-06-03 150 views
2

我有一個有兩列的數據框。第一列定義數據的子集。我想查找第二列中只出現在第一列的一個子集中的所有值。R - 在數據幀的子集中查找所有唯一值

例如,來自:

df=data.frame(
    data_subsets=rep(LETTERS[1:2],each=5), 
    data_values=c(1,2,3,4,5,2,3,4,6,7)) 

data_subsets data_values 
     A   1 
     A   2 
     A   3 
     A   4 
     A   5 
     B   2 
     B   3 
     B   4 
     B   6 
     B   7 

我將要提取的以下數據幀。

data_subsets data_values 
    A    1 
    A    5 
    B    6 
    B    7 

我一直在玩弄duplicated,但我似乎無法使它發揮作用。任何幫助表示讚賞。有幾個主題處理類似的問題,我希望我沒有忽視我的搜索答案!

EDIT

我修改從@Matthew倫德伯格計數元件的數量,並從數據幀中提取的方法。出於某種原因,他的做法是不與數據幀我有工作,所以我想出了這一點,這是不太優雅,但能夠完成任務:

counts=rowSums(do.call("rbind",tapply(df$data_subsets,df$data_values,FUN=table))) 
extract=names(counts)[counts==1] 
df[match(extract,df$data_values),] 

回答

5

首先,找到每個元素的計數DF $ data_values:

x <- sapply(df$data_values, function(x) sum(as.numeric(df$data_values == x))) 

> x 
[1] 1 2 2 2 1 2 2 2 1 1 

現在提取行:

> df[x==1,] 
    data_subsets data_values 
1    A   1 
5    A   5 
9    B   6 
10   B   7 

請注意,你錯過了 「A 5」 以上。沒有「B 5」。

+0

非常感謝 - 編輯上面,以反映我的錯誤!當應用到我自己的數據集時,我得到錯誤「級別集合的因素是不同的」。將調查並回報.. – jslefche

+0

適用於示例數據集如此upvote,但出於某種原因,不會用於我的真實數據集。請參閱編輯頂部以查看我的(不雅)解決方案 – jslefche

2

您對duplicated有正確的想法。訣竅是結合fromLast = TRUEfromLast = FALSE選項來獲取非重複行的完整列表。

!duplicated(df$data_values,fromLast = FALSE)&!duplicated(df$data_values,fromLast = TRUE) 
[1] TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE TRUE 

用這個載體索引你data.frame給出:

df[!duplicated(df$data_values,fromLast = FALSE)&!duplicated(df$data_values,fromLast = TRUE),] 
    data_subsets data_values 
1    A   1 
5    A   5 
9    B   6 
10   B   7 
+0

謝謝!似乎對於示例數據集運行良好,但我在申請自己的數據集時遇到了困難。看我的編輯頂部我的(不雅)解決方案 – jslefche

0

P·拉普安特的回答的一個變種是

df[! df$data_values %in% df[duplicated(unique(df)$data_values), ]$data_values,] 

unique()涉及的可能(不是在您的測試數據)數據中的某些行可能相同,並且如果相同的data_values不出現在不同的data_sets(或d istinct其他列)。

相關問題