数据行最大值 table
Row maximum in data table
我有一个 8,000,000 行的数据集,在 data.table 中有 100 列,其中每列都是一个计数。我需要找到每行中的最大计数以及该最大值在哪一列中。
我可以使用
快速获取每行哪一列的最大值
dt <- dt[, maxCol := which.max(.SD), by=pmxid]
但尝试使用
获得实际最大值
dt <- dt[, nmax := max(.SD), by=pmxid]
非常慢。我 运行 用了将近 20 分钟,只计算了 200,000 行最大值。找到最大列花了大约。所有 8,000,000 行需要 2 分钟。
为什么找到最大值需要这么长时间?它不应该与 which.max()
或更少花费相同的时间吗?
尽管您正在寻找 data.table
解决方案,但这里有一个 base R
解决方案,它对您的数据集来说足够快。
indx <- max.col(df, ties.method='first')
df[cbind(1:nrow(df), indx)]
在稍大的数据集上,system.time
比较显示
system.time({
indx <- max.col(df1, ties.method='first')
res <- df1[cbind(1:nrow(df1), indx)]
})
# user system elapsed
# 2.180 0.163 2.345
df1$pmxid <- 1:nrow(df1)
dt <- as.data.table(df1)
system.time(dt[, nmax:= max(.SD), by= pmxid])
# user system elapsed
#1265.792 2.305 1267.836
base R
方法比 post.
中的 data.table
方法更快
数据
set.seed(24)
df <- as.data.frame(matrix(sample(c(NA,0:20), 20*10,
replace=TRUE), ncol=10))
#if there are NAs, change it to lowest number
df[is.na(df)] <- -999
set.seed(585)
df1 <- as.data.frame(matrix(sample(c(NA,0:20), 100*1e6,
replace=TRUE), ncol=100))
df1[is.na(df1)] <- -999
对于 data.table、
中的最大列数
dt[, max:= do.call(pmax, .SD)]
比dt[, nmax:= max(.SD), by= 1:nrow(dt)]
快得多,比上面的base R
解决方案快得多:
library(data.table)
ncols=100
nrows=8000000
dfi <- as.data.frame(matrix(runif(ncols*nrows), ncol = ncols, nrow = nrows))
df=dfi
system.time({
indx <- max.col(df, ties.method='first')
df$max <- df[cbind(1:nrow(df1), indx)]
})
# user system elapsed
# 8.89 1.37 10.45
dt <- as.data.table(dfi)
system.time({
dt[, max:= do.call(pmax, .SD)]
})
# user system elapsed
# 3.31 0.01 3.33
- 计算出 Colmax 索引后,使用该索引检索每行中的最大值
dt[Colmax == <value>]
或者,
dt[J(<values>), on = 'Colmax']
- 此外,
中的语法错误
dt[, nmax := max(.SD), by = pmxid]
这会整理一个 nrow(dt) * length(.SD)
长度的向量(请参阅 max() 的说明中的 注)
改为尝试:
dt[, nmax := apply(.SD, 1, max), by = pmxid]
或者,并行最大值:
dt[, nmax := pmax(.SD), by = pmxid]
我有一个 8,000,000 行的数据集,在 data.table 中有 100 列,其中每列都是一个计数。我需要找到每行中的最大计数以及该最大值在哪一列中。
我可以使用
快速获取每行哪一列的最大值dt <- dt[, maxCol := which.max(.SD), by=pmxid]
但尝试使用
获得实际最大值dt <- dt[, nmax := max(.SD), by=pmxid]
非常慢。我 运行 用了将近 20 分钟,只计算了 200,000 行最大值。找到最大列花了大约。所有 8,000,000 行需要 2 分钟。
为什么找到最大值需要这么长时间?它不应该与 which.max()
或更少花费相同的时间吗?
尽管您正在寻找 data.table
解决方案,但这里有一个 base R
解决方案,它对您的数据集来说足够快。
indx <- max.col(df, ties.method='first')
df[cbind(1:nrow(df), indx)]
在稍大的数据集上,system.time
比较显示
system.time({
indx <- max.col(df1, ties.method='first')
res <- df1[cbind(1:nrow(df1), indx)]
})
# user system elapsed
# 2.180 0.163 2.345
df1$pmxid <- 1:nrow(df1)
dt <- as.data.table(df1)
system.time(dt[, nmax:= max(.SD), by= pmxid])
# user system elapsed
#1265.792 2.305 1267.836
base R
方法比 post.
data.table
方法更快
数据
set.seed(24)
df <- as.data.frame(matrix(sample(c(NA,0:20), 20*10,
replace=TRUE), ncol=10))
#if there are NAs, change it to lowest number
df[is.na(df)] <- -999
set.seed(585)
df1 <- as.data.frame(matrix(sample(c(NA,0:20), 100*1e6,
replace=TRUE), ncol=100))
df1[is.na(df1)] <- -999
对于 data.table、
中的最大列数dt[, max:= do.call(pmax, .SD)]
比dt[, nmax:= max(.SD), by= 1:nrow(dt)]
快得多,比上面的base R
解决方案快得多:
library(data.table)
ncols=100
nrows=8000000
dfi <- as.data.frame(matrix(runif(ncols*nrows), ncol = ncols, nrow = nrows))
df=dfi
system.time({
indx <- max.col(df, ties.method='first')
df$max <- df[cbind(1:nrow(df1), indx)]
})
# user system elapsed
# 8.89 1.37 10.45
dt <- as.data.table(dfi)
system.time({
dt[, max:= do.call(pmax, .SD)]
})
# user system elapsed
# 3.31 0.01 3.33
- 计算出 Colmax 索引后,使用该索引检索每行中的最大值
dt[Colmax == <value>]
或者,
dt[J(<values>), on = 'Colmax']
- 此外, 中的语法错误
dt[, nmax := max(.SD), by = pmxid]
这会整理一个 nrow(dt) * length(.SD)
长度的向量(请参阅 max() 的说明中的 注)
改为尝试:
dt[, nmax := apply(.SD, 1, max), by = pmxid]
或者,并行最大值:
dt[, nmax := pmax(.SD), by = pmxid]