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来强调解决方案的好处