R 将变量添加到包含每行最大值的数据框中

R 将变量添加到包含每行最大值的数据框中,r,R,我想在数据帧(df)中添加一个变量(列),在每行中包含该行第2列到第26列的最大值 对于第一行,代码为: df$max[1] <- max(df[1,2:26]) df$max[1]您可以使用apply。例如: df[, "max"] <- apply(df[, 2:26], 1, max) df[,“max”]您可以使用apply。例如: df[, "max"] <- apply(df[, 2:26], 1, max) df[,“max”]带有pmax的矢量化版本: d

我想在数据帧(
df
)中添加一个变量(列),在每行中包含该行第2列到第26列的最大值

对于第一行,代码为:

df$max[1] <- max(df[1,2:26])

df$max[1]您可以使用
apply
。例如:

df[, "max"] <- apply(df[, 2:26], 1, max)

df[,“max”]您可以使用
apply
。例如:

df[, "max"] <- apply(df[, 2:26], 1, max)

df[,“max”]带有
pmax的矢量化版本

df$max <- do.call(pmax, df[2:26])

do.call的第二个参数需要是函数的参数列表
df
已经是列表,因此我们将其与
na.rm=TRUE
参数连接(转换为列表)。

矢量化版本与
pmax

df$max <- do.call(pmax, df[2:26])

do.call的第二个参数需要是函数的参数列表
df
已经是list,所以我们将它与
na.rm=TRUE
参数(转换为list)连接起来。

这里有两个附加方法。第一个是以R为基数,将矩阵提取
[
max.col
相结合,这将返回一个向量,索引每行中最大值的列位置

df$max <- df[2:26][cbind(seq_len(nrow(df)), max.col(df[2:26]))]

让我们做一些基准测试

# 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))
因此,
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))

这里有两种额外的方法。第一种方法是在基R中,将矩阵提取
[
max.col
相结合,它返回一个向量,索引每行中最大值的列位置

df$max <- df[2:26][cbind(seq_len(nrow(df)), max.col(df[2:26]))]

让我们做一些基准测试

# 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))
因此,
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))

如果我希望每一行的列名称为max,该怎么办?例如df$max[1]=cwhat,如果我需要添加na.rm=TRUE,该怎么办?如果我希望每一行的列名称为max,该怎么办?例如df$max[1]=cwhat如果我需要添加na.rm=TRUE?这两个版本中的一个在
pmax
apply
版本之间更快?我必须这样做数千次。我尝试过,pmax似乎要快得多。现在我正在努力找到一种方法来忽略缺少的值
df$max@Alex是的,语义很奇怪d帮助页面不清楚。这是有效的:
do.call(pmax,c(df[2:26],list(na.rm=TRUE))
do.call的第二个参数应该是函数的参数列表,所以您需要所有参数,其中
na.rm
在一个列表中。@Alex
df
是一个列表(正如每个
data.frame
),
list(na.rm=TRUE)
是另一个,
c
将它们连接成一个。在
pmax
apply
版本之间,这两个版本中的一个速度更快?我必须花费数千Coolumsmillion。我试过了,pmax似乎要快得多。现在我正在努力寻找一种方法来忽略缺少的值
df$max@Alex是的,语义很奇怪,帮助页面也不清楚。这样做:
do.call(pmax,c(df[2:26],list(na.rm=TRUE))
do.call的第二个参数应该是函数的参数列表,所以你需要所有参数,其中
na.rm
在一个列表中。@Alex
df
是一个列表(就像每个
data.frame
),
列表一样)(na.rm=TRUE)
是另一个,将它们连接成一个。
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