My Problem
我有以下(简化)数据框架df
:
A B C
[1,] 2 -5 20
[2,] -10 -1 10
[3,] 10 -10 0
我只想分离出最小的值
[ 2, -1, 0 ]
我该怎么做呢?
What I've try
到目前为止,我只是用它来显示每行绝对的最小值:
MagMin <- vector()
for(i in 1:nrow(df)){
sub <- df[i,]
MagMin[i] <- min(abs(df[i,]))
}
得到[2, 1, 0]
,但显然,我已经失去了最小值方向的标志。
我在python中找到了一个很好的答案,但是我想不出如何在这里应用它!
apply(mat, 1, function(z) z[which.min(abs(z))])
# [1,] [2,] [3,]
# 2 -1 0
演练:
当您想要最小幅度时,
min(abs(val))
将返回该值的正数,您知道…val <- c(-10L, -1L, 10L) min(abs(val)) # [1] 1
我们可以使用
which.min(abs(val))
来确定向量中哪个是最小幅度,它返回向量上的索引:which.min(abs(val)) # [1] 2
使用它,我们可以根据最小幅度提取特定值(pos或负值):
val[which.min(abs(val))] # [1] -1
为每一行重复操作,我们使用
apply(mat, 1, ...)
。1
是MARGIN=1
的,意思是"行",第三个参数(FUN=
)是一个函数,它只接受一个参数,并对它做一些事情;在这种情况下,第一次调用它时,z
实际上是mat[1,]
,其值为c(2, -5, 20)
;第二次,它实际上是mat[2,]
,值为c(-10, -1, 10)
;等。
数据
mat <- structure(list(A = c(2L, -10L, 10L), B = c(-5L, -1L, -10L), C = c(20L, 10L, 0L)), class = "data.frame", row.names = c("[1,]", "[2,]", "[3,]"))