2013-04-09 62 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]) 
              }) 
      )