2013-04-09 74 views
0

我試圖自動創建一個新的數據框,該數據框在給定現有數據框的情況下包含數值變量的中間值或某個因子的最常見類別。所以:具有混合數據類型的自動數據框彙總

Number Factor 
3  A 
2  A 
5  B 

應該變成

Number Factor 
3  A 

我可以單獨計算它的每個變量。對於純粹的數值變量,我甚至可以使用colMeans命令。對於純因子變量,我會使用which.max()。但我一直無法將兩者合併成一個可擴展的和期活的解決方案

+0

我很困惑,你是否總結了最常見因素的「數字」列? – Nishanth 2013-04-09 12:49:28

+0

你的中位數是3嗎? – 2013-04-09 13:08:25

+0

是的,當然是。在我腦中轉換中位數和平均值概念。感謝您的清理。 – CGN 2013-04-09 13:13:28

回答

1

可以測試類似的東西:

FUN <- function(x) { 
    if (is.numeric(x)) 
    return(median(x)) 
    else 
    x <- sort(as.character(x)) 
    rl1 <- rle(x) 
    rl1$val[which.max(rl1$le)] 
    } 

as.data.frame(lapply(tab, FUN)) 
aggregate(tab, by=list(gl(1,nrow(tab))), FUN=FUN) 
# even easier 
bob <- lapply(tab, function(x) if(is.numeric(x)) median(x) else x[median(as.numeric(x))]) 
as.data.frame(bob) 
+0

這個技巧。謝謝。 – CGN 2013-04-09 13:11:31

2

您可以使用lapplyif分支:

y <- read.table(text = "Number Factor 
3  A 
2  A 
5  B", header = TRUE) 

as.data.frame(lapply(y, function(x) { 
if (is.numeric(x)) return (median(x)) 
else return(x[which.max(table(x))]) 
})) 
+0

我不認爲這會返回一個模式,而是會返回一個因子的最後一個級別。 – 2013-04-09 13:05:40

+1

只需編輯它以使用'which.max(table(x))',那麼它就可以工作。 +1從我 – 2013-04-09 13:06:55

+0

@ SimonO101感謝您的注意。 – Henrik 2013-04-09 13:19:02

1
as.data.frame(lapply(dfrm, function(x) if(is.numeric(x)) { 
          median(x) } else { 
          names(sort(table(x) , decreasing=TRUE)[1]) 
              }) 
      )