我正在尝试自动创建一个新的数据框,给定现有的数据框,该数据框包含数值变量的中位数或因子的最常见类别。所以:
Number Factor
3 A
2 A
5 B
应该变成
Number Factor
3 A
我可以单独为每个变量计算它。对于纯数值变量,我什至可以使用 colMeans 命令。对于纯因子变量,我会使用 which.max()。但我无法将两者结合成一个可扩展且灵活的解决方案
您可以使用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))])
}))
你可以测试这样的东西:
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)
as.data.frame( lapply(dfrm, function(x) if(is.numeric(x)) {
median(x) } else {
names(sort( table(x) , decreasing=TRUE )[1])
})
)