我想在数据框( df )中添加一个变量(列),在每行中包含第2到第26列的该行的最大值 .
df
对于第一行,代码将是:
df$max[1] <- max(df[1,2:26])
我正在寻找一种方法来概括第1行到第865行 . 如果我给:
df$max[1:865] <- max(df[1:865, 2:26])
我得到变量 df$max 的所有行的总体最大值 .
df$max
你可以使用 apply . 例如:
apply
df[, "max"] <- apply(df[, 2:26], 1, max)
这是一个基本的例子:
> df <- data.frame(a=1:50, b=rnorm(50), c=rpois(50, 10)) > df$max <- apply(df, 1, max) > head(df, 2) a b c max 1 1 1.3527115 9 9 2 2 -0.6469987 20 20 > tail(df, 2) a b c max 49 49 -1.4796887 10 49 50 50 0.1600679 13 50
矢量化版本 pmax :
pmax
df$max <- do.call(pmax, df[2:26])
这是另外两种方法 . 第一个,在基数R中,是将矩阵提取 [ 与 max.col 组合在一起,它返回索引每行中最大值的列位置的向量 .
[
max.col
df$max <- df[2:26][cbind(seq_len(nrow(df)), max.col(df[2:26]))]
cbind 构造一个矩阵,索引每行的最大值的位置, [ 使用它来提取该值 .
cbind
第二种是在 matrixStats 包中使用 rowMaxs .
matrixStats
rowMaxs
我们来做一些基准测试 .
# data.frame with 1000 observations and 26 variables set.seed(1234) df <- data.frame(id=paste0(letters[-1], 1:40), matrix(rnorm(25000L, 5L, 10L), 1000L))
同时将 matrixStats 包中的 rowMaxs 函数添加到混合中 .
library(matrixStats) library(microbenchmark) microbenchmark(apply=apply(df[, 2:26], 1, max), pmax=do.call(pmax, df[2:26]), max.colSub=df[2:26][cbind(seq_len(nrow(df)), max.col(df[2:26]))], rowMaxs=rowMaxs(as.matrix(df[2:26]))) Unit: microseconds expr min lq mean median uq max neval cld apply 1610.540 1786.5905 2193.5334 1863.5680 1990.4380 6915.999 100 c pmax 354.382 364.6455 380.1720 373.3405 385.4580 567.923 100 a max.colSub 604.416 651.7430 822.6015 664.7155 681.2510 3086.512 100 b rowMaxs 243.762 264.0040 320.2350 277.9750 290.5190 2328.712 100 a
因此, rowMaxs 是明显的赢家,接着是 pmax ,然后是 max.col ,矩阵提取, apply 位于包的尾端 .
对于包含10000行和26列的data.frame,我们得到了类似的故事:
set.seed(1234) df <- data.frame(id=paste0(letters[-1], 1:400), matrix(rnorm(250000L, 5L, 10L), 10000L))
上面的代码返回
Unit: milliseconds expr min lq mean median uq max neval cld apply 15.193361 18.299830 21.737516 20.337880 21.774793 99.44836 100 c pmax 3.060853 3.101481 3.156630 3.137545 3.191430 3.54182 100 a max.colSub 3.338828 3.642603 7.051700 3.992708 6.336531 84.43119 100 b rowMaxs 1.244184 1.322302 2.675281 1.508474 1.638053 79.28054 100 a
3 回答
你可以使用
apply
. 例如:这是一个基本的例子:
矢量化版本
pmax
:这是另外两种方法 . 第一个,在基数R中,是将矩阵提取
[
与max.col
组合在一起,它返回索引每行中最大值的列位置的向量 .cbind
构造一个矩阵,索引每行的最大值的位置,[
使用它来提取该值 .第二种是在
matrixStats
包中使用rowMaxs
.我们来做一些基准测试 .
同时将
matrixStats
包中的rowMaxs
函数添加到混合中 .因此,
rowMaxs
是明显的赢家,接着是pmax
,然后是max.col
,矩阵提取,apply
位于包的尾端 .对于包含10000行和26列的data.frame,我们得到了类似的故事:
上面的代码返回