我需要计算3列中每行的最大值。
表可以是:
x = c(1,2,3,4,5 )
y = c(2,3,3,1,1 )
z = c(4,3,2,1,1 )
df<-data.frame(x,y,z)
我需要得到:
x y z max
1 1 2 4 4
2 2 3 3 3
3 3 3 2 3
4 4 1 1 4
5 5 1 1 5
我试过了:
df$max<-max(x, y,z)
但我明白了:
x y z max
1 1 2 4 5
2 2 3 3 5
3 3 3 2 5
4 4 1 1 5
5 5 1 1 5
那么,我该如何正确地做到这一点?
答案 0 :(得分:6)
使用data.table:)
library(data.table)
x = c(1,2,3,4,5 )
y = c(2,3,3,1,1 )
z = c(4,3,2,1,1 )
dt<-data.table(x,y,z)
dt[, max:=pmax(x,y,z)]
dt
答案 1 :(得分:5)
您可以像这样使用apply
功能:
df$max<-apply(X=df, MARGIN=1, FUN=max)
MARGIN=1
参数表示,X
中的每一行都希望在FUN
中应用该函数。如果您使用MARGIN=2
,它将按列或MARGIN = c(1,2)
,它将同时为行和列。
答案 2 :(得分:4)
尝试:
df$max <- do.call(`pmax`, df)
df
# x y z max
#1 1 2 4 4
#2 2 3 3 3
#3 3 3 2 3
#4 4 1 1 4
#5 5 1 1 5
set.seed(49)
df <- as.data.frame(matrix(sample(0:20, 1e5*3,replace=TRUE), ncol=3))
f1 <- function() df$max <- apply(df, 1, max)
f2 <- function() df$max <- do.call(`pmax`, df)
f3 <- function() setDT(df)[, max:=pmax(V1,V2,V3)]
library(microbenchmark)
microbenchmark(f1(), f2(),f3(), unit="relative", times=25)
#Unit: relative
# expr min lq median uq max neval
# f1() 48.143635 48.287875 46.031638 32.868138 8.922203 25
# f2() 1.269581 1.373479 1.654625 2.324896 1.182107 25
# f3() 1.000000 1.000000 1.000000 1.000000 1.000000 25
答案 3 :(得分:1)
如果约翰的帖子接受他,但只是为了显示结果,他的评论确实有效
x = c(1,2,3,4,5 )
y = c(2,3,3,1,1 )
z = c(4,3,2,1,1 )
df<-data.frame(x,y,z)
df$max<-apply(df, 1, max)
df$max
#[1] 4 3 3 4 5
df
#x y z max
#1 2 4 4
#2 3 3 3
#3 3 2 3
#4 1 1 4
#5 1 1 5
答案 4 :(得分:0)
使用dplyr 1.0.0
df %>% rowwise() %>%
mutate(max = max(x, y, z))
答案 5 :(得分:-4)
您正在使用的编程语言是什么?
我会设置一个循环:
for i = 1 to 5
j[i] = max(x[i],y[i],z[i])
next