2014-10-22 55 views
1

我擁有一個包含兩列以上的數據幀。用R中的「by」刪除空組合

d <- data.frame(
    a=c(1, 1, 2, 2), 
    b=c(T, T, T, F), 
    c=c(0, 0.25, 0.5, 0.75), 
    d=c("a", "b", "c", "d") 
) 

我想要做的組「d」是由列「A」,和「b」的行,然後在列「c」和「d」的操作。然而,當我使用by時,我得到的空條目對應於未出現在「d」中的組合。

by(d, list(d$a, d$b), nrow) 

# : 1 
# : FALSE 
# [1] NA 
# ------------------------------------------------------------ 
# : 2 
# : FALSE 
# [1] 1 
# ------------------------------------------------------------ 
# : 1 
# : TRUE 
# [1] 2 
# ------------------------------------------------------------ 
# : 2 
# : TRUE 
# [1] 1 

我想是沒有對應於= 1和B空單元格的結果= FALSE:

# : 2 
# : FALSE 
# [1] 1 
# ------------------------------------------------------------ 
# : 1 
# : TRUE 
# [1] 2 
# ------------------------------------------------------------ 
# : 2 
# : TRUE 
# [1] 1 

在這個例子中,我只是用nrow,但在現實中,我需要這兩個「c」和「d」的功能,所以我真的需要by而不是tapply(雖然如果有人知道如何做到這一點與tapply,這也很受歡迎)。因爲我的數據非常大,所以我不想過濾事實後的by對象。

+1

如果你願意使用'你可以很容易地dplyr'做類似:'d%>%group_by(a,b)%>%mutate(newcol = paste0(c,d))''。如果你需要答案,那也是可行的。 – hrbrmstr 2014-10-22 01:06:09

+1

你想要什麼結果?我真的不明白你的解釋 – 2014-10-22 01:09:15

+1

這裏採取了一個盲目的過濾器(Filter(Negate(is.na),by(d,list(d $ a,d $ b),nrow))' – rawr 2014-10-22 01:13:49

回答

4

使用interactiondrop=TRUE

by(d, list(group=interaction(d$a,d$b,drop=TRUE)), nrow) 

#group: 2.FALSE 
#[1] 1 
#------------------------------------------------------ 
#group: 1.TRUE 
#[1] 2 
#------------------------------------------------------- 
#group: 2.TRUE 
#[1] 1 
+0

像往常一樣,在R底部有一行。完美,謝謝! – rmccloskey 2014-10-22 02:09:55

2

這給出了一個數據幀,每個單元一行除NA單元外。 bbby結果:

> na.omit(as.data.frame.table(bb)) 
    a  b Freq 
2 2 FALSE 1 
3 1 TRUE 2 
4 2 TRUE 1 

這是否也適用於其他職能的工作取決於他們返回的內容。

在評論中,海報澄清,他們不想減少by的結果,而是取代by。在這種情況下,嘗試aggregate

ix <- 1:nrow(d) 
aggregate(ix ~ a+b, d, function(ix) nrow(d[ix, ])) 

,並提供:

a  b ix 
1 2 FALSE 1 
2 1 TRUE 2 
3 2 TRUE 1 

在我們能替代功能都使用length這種特殊情況下,但我們顯示它以這種形式,因爲它依賴於d[ix, ]等可能是任意複雜的,可能取決於任何或所有的列。

+0

它可以工作,但我寧願不必首先創建巨大的''by''對象。我的數據非常龐大。 – rmccloskey 2014-10-22 01:52:00

+0

你可以嘗試'聚合'。請參閱附加答案。 – 2014-10-22 02:03:30

+0

正如我在問題中所說的,我需要列「c」和「d」作爲我試圖使用的函數。 ''aggregate''不會讓你在數據幀AFAIK的多列上調用一個函數。 – rmccloskey 2014-10-22 02:07:15

1

你可以使用data.table對大數據集

library(data.table) 
    setDT(d)[, .N, by=list(a,b)] 
    # a  b N 
    #1: 1 TRUE 2 
    #2: 2 TRUE 1 
    #3: 2 FALSE 1 

或者

setorder(setDT(d), a,b) #would be faster 
    d[, .N, by=list(a,b)] 
    # a  b N 
    #1: 1 TRUE 2 
    #2: 2 FALSE 1 
    #3: 2 TRUE 1