2015-12-09 197 views
2

請考慮以下示例數據框。另一列的唯一值的一列的唯一值

> ww 
    col1 col2 
1 1 A 
2 2 A 
3 3 A 
4 4 B 
5 5 B 
6 6 B 
7 7 C 
8 8 C 
9 9 C 
> dput(ww) 
structure(list(col1 = c(1, 2, 3, 4, 5, 6, 7, 8, 9), col2 = structure(c(1L, 
1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor")), .Names = c("col1", 
"col2"), row.names = c(NA, -9L), class = "data.frame") 

我想知道如果col2每個類別有col1與否不同的值。最後,我想得到一個答案(TRUE或FALSE)。 TRUE(如果col2所有類別具有在col1完全不同的值的集合),和FALSE(如果存在至少2個類別中col2具有在col1常見。

對於上面的例子ATLEAST 1個值,答案是因爲類別TRUE A,B和C的col1沒有任何值,因爲它們是相同的,col1的值對於A是1,2,3。col1的值對於B是4,5,6。col1的值是7,8,9對於C.

我可以嘗試將數據幀的數據拆分col2,然後爲每個成員保存col1的值,然後使用檢查常用值但是對於大型數據框而言,這是一種漫長而低效的過程。有人可以爲我提供有效的解決方案嗎?任何數據表解決方案也可以。

+0

你可以使用'duplicateated'來查看是否有重複。我假設兩行'1 A'和'1 A'是你想要創造虛假回報的情況。 'duplicateated'將返回重複的值(不包括原始值)。如果我理解,將它與'any'結合使用可以爲您提供所需的功能。 – giraffehere

+1

'col2'的類別可以在'col1'中有重複的值,即A類有兩個1嗎?如果沒有,@giraffehere的建議是現貨。事實上,你想要使用'anyDuplicated' –

回答

4

你可以這樣做:

library(data.table) 
setDT(ww)[, un.col1 := uniqueN(col1)==.N, by = col2] 

這給:

> ww 
    col1 col2 un.col1 
1: 1 A FALSE 
2: 1 A FALSE 
3: 3 A FALSE 
4: 4 B TRUE 
5: 5 B TRUE 
6: 6 B TRUE 
7: 1 C TRUE 
8: 8 C TRUE 
9: 9 C TRUE 

或者像@giraffehere在評論中提到的,duplicatedanyanyDuplicated組合:

setDT(ww)[, un.col1 := !anyDuplicated(col1), by = col2] 

如果您正在尋找類別之間的獨特性,如@MatthewPlourde建議,那麼你可以使用:

setDT(ww)[, un.col2 := uniqueN(col2) > 1, by = col1] 

這給:

> ww 
    col1 col2 un.col2 
1: 1 A TRUE 
2: 1 A TRUE 
3: 3 A FALSE 
4: 4 B FALSE 
5: 5 B FALSE 
6: 6 B FALSE 
7: 1 C TRUE 
8: 8 C FALSE 
9: 9 C FALSE 

使用的數據:

ww <- structure(list(col1 = c(1, 1, 3, 4, 5, 6, 1, 8, 9), 
        col2 = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L), .Label = c("A", "B", "C"), class = "factor")), 
       .Names = c("col1", "col2"), row.names = c(NA, -9L), class = "data.frame") 
+1

我不相信這是OP正在尋找的東西。據我瞭解,他/她正在尋找類別之間的獨特性,而不是內部。 –

+0

馬修是正確的。我正在尋找類別之間的唯一性。 – user3664020

+0

@MatthewPlourde查看更新 – Jaap

1

如果一個類別內只能有唯一的值,那麼您只需要

anyDuplicated(ww$col1) == 0 

如果可以有一個類別中的重複,刪除它們與

ww2 <- ww[!duplicated(interaction(ww$col1, ww$col2)), ] 

然後在使用anyDuplicatedcol1

2

我的OP的理解是,應該有一個單一的TRUE/FALSE值爲整個數據框。這裏是一個dplyr解決方案:

library(dplyr) 

ww %>% 
    group_by(col1) %>% 
    summarise(ndis = n_distinct(col2)) %>% 
    summarise(all(ndis == 1)) 
+0

我認爲這仍然是錯過了一點。我對OP的文章的閱讀是,他/她想檢查類別之間的唯一性,而不是內部。 –

+0

@MatthewPlourde - 我的解決方案確實檢查*類別之間的唯一性*。 – davechilders

+0

對不起,你是對的,我誤讀了列名。 +1 –