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
在一个列表中。@Alexdf
是一个列表(正如每个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
在一个列表中。@Alexdf
是一个列表(就像每个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