我有一个包含4列的data.frame(如下所示)。我想找到每行的最小列索引(不是值)。任何想法,以实现这一点?
> d
V1 V2 V3 V4
1 0.388116155 0.98999967 0.41548536 0.76093748
2 0.495971331 0.47173142 0.51582728 0.06789924
3 0.436495321 0.48699268 0.21187838 0.54139290
4 0.313514389 0.50265539 0.08054103 0.46019601
5 0.277275961 0.39055360 0.29594162 0.70622532
6 0.264804739 0.86996266 0.85708635 0.61136741
7 0.627344463 0.54277873 0.96769568 0.80399490
8 0.814420492 0.35362949 0.39023446 0.39246250
9 0.517459983 0.65895805 0.93662382 0.06762166
10 0.498319937 0.67081260 0.43225997 0.42139151
11 0.046862110 0.97304915 0.06542971 0.09779383
12 0.619009734 0.82363618 0.14514799 0.52858058
13 0.007262782 0.82203403 0.08573499 0.61094206
14 0.001602586 0.33241230 0.57762669 0.45285004
15 0.698388370 0.83541257 0.21051568 0.84431347
16 0.296088411 0.34363164 0.02179999 0.70551493
17 0.897869571 0.50625928 0.92861583 0.61249019
18 0.372497428 0.29025182 0.23201891 0.55737699
19 0.172931860 0.03604668 0.50291560 0.10850847
20 0.988827604 0.15800337 0.87999839 0.09899663
所以我想要以下输出:
1 1
2 4
3 3
4 3
继续所有行。 感谢
答案 0 :(得分:16)
您的英文说明建议您:
apply( df, 1, which.min)
但是,如果上述解释是正确的,那么您给出的答案不会被格式化为向量,并且不是正确的答案。哦等等,你在期待rownumbers。
as.matrix(apply( d, 1, which.min))
[,1]
1 1
2 4
3 3
4 3
5 1
6 1
7 2
8 2
9 4
10 4
11 1
12 3
13 1
14 1
15 3
16 3
17 2
18 3
19 2
20 4
答案 1 :(得分:0)
另一个选项是max.col
中的d
乘以-1
max.col(-d)
# [1] 1 4 3 3 1 1 2 2 4 4 1 3 1 1 3 3 2 3 2 4
如果需要矩阵作为输出,请使用
cbind(1:nrow(d), # row
max.col(-d)) # column position of minimum
这是这两种方法的基准
set.seed(42)
dd <- as.data.frame(matrix(runif(1e5 * 100), nrow = 1e5, ncol = 100))
library(microbenchmark)
library(ggplot2)
b <- microbenchmark(
apply = apply(dd, 1, which.min),
max_col = max.col(-dd),
times = 25
)
autoplot(b)
b
#Unit: milliseconds
# expr min lq mean median uq max neval cld
# apply 705.7478 855.7112 906.2340 892.3214 933.4655 1211.5016 25 b
# max_col 162.8273 175.6363 227.1156 206.0213 225.2973 406.9124 25 a