R 如何为数据帧的每一行找到最小值的索引?
假设我有一个数据帧R 如何为数据帧的每一行找到最小值的索引?,r,matrix,minimum,R,Matrix,Minimum,假设我有一个数据帧dflike [,1] [,2] [,3] [,4] x 1 2 7 1 y 1 5 1 5 我想找到df每行的最小值索引。我的预期结果是 YES NO NO NO YES YES NO YES NO No 我试过了 x <- c(1, 2, 7, 1) y <- c(1, 5, 1, 5) df <- rbind(x, y) apply(df, 1, which.min) x尝试使用 #Code X
df
like
[,1] [,2] [,3] [,4]
x 1 2 7 1
y 1 5 1 5
我想找到df
每行的最小值索引。我的预期结果是
YES NO NO NO YES
YES NO YES NO No
我试过了
x <- c(1, 2, 7, 1)
y <- c(1, 5, 1, 5)
df <- rbind(x, y)
apply(df, 1, which.min)
x尝试使用
#Code
X==apply(X,1, min)
输出:
X==apply(X,1, min)
V2 V3 V4 V5
x TRUE FALSE FALSE TRUE
y TRUE FALSE TRUE FALSE
使用的一些数据:
#Data
X <- structure(c(1L, 1L, 2L, 5L, 7L, 1L, 1L, 5L), .Dim = c(2L, 4L), .Dimnames = list(
c("x", "y"), c("V2", "V3", "V4", "V5")))
#数据
X试试看
#Code
X==apply(X,1, min)
输出:
X==apply(X,1, min)
V2 V3 V4 V5
x TRUE FALSE FALSE TRUE
y TRUE FALSE TRUE FALSE
使用的一些数据:
#Data
X <- structure(c(1L, 1L, 2L, 5L, 7L, 1L, 1L, 5L), .Dim = c(2L, 4L), .Dimnames = list(
c("x", "y"), c("V2", "V3", "V4", "V5")))
#数据
X我们可以使用apply
在行上循环(MARGIN=1
),将行中的元素与行的min
进行比较
t(apply(df, 1, function(x) x == min(x)))
-输出
# [,1] [,2] [,3] [,4]
#x TRUE FALSE FALSE TRUE
#y TRUE FALSE TRUE FALSE
或者使用matrixStats
library(matrixStats)
df == rowMins(df)
# [,1] [,2] [,3] [,4]
#x TRUE FALSE FALSE TRUE
#y TRUE FALSE TRUE FALSE
或者,如果我们想坚持使用base R
并使用矢量化选项,那么pmin
是另一种方法(将矩阵
转换为data.frame
)
我们可以使用apply
在行上循环(MARGIN=1
),将行中的元素与行的min
进行比较
t(apply(df, 1, function(x) x == min(x)))
-输出
# [,1] [,2] [,3] [,4]
#x TRUE FALSE FALSE TRUE
#y TRUE FALSE TRUE FALSE
或者使用matrixStats
library(matrixStats)
df == rowMins(df)
# [,1] [,2] [,3] [,4]
#x TRUE FALSE FALSE TRUE
#y TRUE FALSE TRUE FALSE
或者,如果我们想坚持使用base R
并使用矢量化选项,那么pmin
是另一种方法(将矩阵
转换为data.frame
)
使用Reduce
+pmin
(最好使用do.call
(而不是Reduce
)的基本R选项,因为Reduce
会慢得多,因此从速度的角度来看,当涉及到更多列时会出现这种情况。)
给予
使用Reduce
+pmin
(最好使用do.call
(而不是Reduce
)的基本R选项,因为Reduce
会慢得多,因此从速度的角度来看,当涉及到更多列时会出现这种情况。)
给予
尝试t(应用(df,1,函数(x)x==min(x))
再次感谢@akrun!或者df[cbind(seq_len(nrow(df)),max.col(-df))==df
尝试t(应用(df,1,函数(x)x==min(x))
再次感谢@akrun!或者df[cbind(seq_len(nrow(df)),max.col(-df))==df
我刚刚在底部看到了你的pmin
方法,比我使用Reduce
的版本要好得多:)@thomasscoding没问题。我认为这是一个不错的选择。另外,还有一些函数在do.call
中工作,而不是在Reduce
中工作,viceversaI在我的回答中添加了一条评论,强调了通过应用do.call
解决方案的好处。我刚刚在底部看到了您的pmin
方法,使用Reduce
:)@ThomasIsCoding比我的版本好得多,没关系。我认为这是一个不错的选择。此外,还有一些函数在do.call
中工作,而不是在Reduce
中工作,viceversaI在我的回答中添加了一条注释,通过应用do.call来强调解决方案的好处