【发布时间】:2018-10-27 00:52:57
【问题描述】:
我正在尝试找到一种有效的方法来在 data.table 中的列子集上获取逐行模式
#Sample data
a <- data.frame(
id=letters[],
dattyp1 = sample( 1:2, 26, replace=T) ,
dattyp2 = sample( 1:2, 26, replace=T) ,
dattyp3 = sample( 1:2, 26, replace=T) ,
dattyp4 = sample( 1:2, 26, replace=T) ,
dattyp5 = sample( 1:2, 26, replace=T) ,
dattyp6 = sample( 1:2, 26, replace=T)
)
library(modeest)
library(data.table)
我从:To find "row wise" "Mode" of a given data in R 知道我可以这样做:
Mode <- function(x) {
ux <- unique(x)
ux[which.max(tabulate(match(x, ux)))]
}
apply(a[ ,paste0("dattyp",1:6)], 1, Mode)
但这真的很慢(超过我的数百万条记录)。我认为必须有一种方法可以使用 .SDcols 来做到这一点 - 但这确实是按列模式而不是按行。
a<- data.table( a )
a[ , lapply(.SD , mfv ), .SDcols=c(paste0("dattyp",1:6) ) ]
【问题讨论】:
-
这个例子——6 个二进制整数列,约 1e7 行——是否代表了您的实际数据集?最佳解决方案可能会因列类型、(即整数可以以与字符串不同的方式处理)、列数、基数和行数而有所不同。 (我快速尝试了一下,想不出比你原来的解决方案更快的方法,而且 fwiw,
modeest::mfv()似乎比用户定义的函数Mode()慢)跨度> -
我同意,mfv 比 OP 定义的模式函数慢。
标签: r data.table mode