0

我正在尝试自动创建一个新的数据框,给定现有的数据框,该数据框包含数值变量的中位数或因子的最常见类别。所以:

Number Factor  
3      A
2      A
5      B

应该变成

Number Factor  
3      A

我可以单独为每个变量计算它。对于纯数值变量,我什至可以使用 colMeans 命令。对于纯因子变量,我会使用 which.max()。但我无法将两者结合成一个可扩展且灵活的解决方案

4

3 回答 3

2

您可以使用lapply分支if

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))])
}))
于 2013-04-09T12:56:02.457 回答
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)
于 2013-04-09T12:49:52.363 回答
1
as.data.frame( lapply(dfrm, function(x) if(is.numeric(x)) {
                            median(x) } else {
                            names(sort( table(x) , decreasing=TRUE )[1])
                                             })
              )
于 2013-04-09T13:00:31.163 回答