我有一个data.frame,其中包含31列和31个观察值。 df中的所有数据都是数字,具有正值和负值。
我想从数据框的前13列中提取具有最大绝对值的观测值的位置索引。
我的代码行为异常,我不知道为什么。
数据库的名称为 loads.P_Y_wolf_df_2012_pca
> head(loads.P_Y_wolf_df_2012_pca)
PC1 PC2 PC3 PC4 PC5 PC6
Mol_17 0.20956737 -0.148512375 0.24587841 -0.269043967 0.18686684 -0.17759436
Mol_18 0.16206391 -0.137572327 0.37520832 -0.243564027 0.18204151 -0.11839496
Mol_20 0.15833954 0.009470871 -0.04321647 0.094148199 0.36981320 -0.34281987
Mol_23 -0.07904978 0.034748195 -0.13504722 -0.271102820 0.03052371 0.15275525
Mol_30 -0.14805422 -0.333887605 -0.05379184 0.003507335 0.19356645 0.01928621
Mol_33 -0.22142249 0.064829612 -0.16049180 -0.278572239 -0.16350937 -0.16854468
我只在这里复制前六个变量以及前五个观察值。
以下是我正在尝试的循环以及相对错误。
> indexvec <- vector()
> for (i in 1:13) {
indexvec[i] <- which(loads.P_Y_wolf_df_2012_pca[, i] == max(abs(loads.P_Y_wolf_df_2012_pca[ , i])))
}
Error in indexvec[i] <- which(loads.P_Y_wolf_df_2012_pca[, i] == max(abs(loads.P_Y_wolf_df_2012_pca[, :
replacement has length zero
解决该问题的第一件事是查看匹配我感兴趣的值的逻辑是否不好。 尽管可能并不漂亮,但匹配功能似乎可以正常工作。
> which(loads.P_Y_wolf_df_2012_pca[, 1] == max(abs(loads.P_Y_wolf_df_2012_pca[ , 1])))
[1] 15
因此,接下来的事情是在for循环中更改某些内容并打印输出,在这里它变得很奇怪:
> for (i in 1:13) {
print(which(loads.P_Y_wolf_df_2012_pca[, i] == max(abs(loads.P_Y_wolf_df_2012_pca[ , i]))))
}
[1] 15
[1] 28
[1] 22
[1] 21
[1] 3
integer(0)
integer(0)
integer(0)
[1] 20
integer(0)
[1] 13
[1] 18
integer(0)
该代码似乎可以在某些列上使用,而不能在其他列上使用!这很奇怪,因为这是第6列中的值。
> loads.P_Y_wolf_df_2012_pca[, 6]
[1] -0.177594359 -0.118394964 -0.342819874 0.152755248 0.019286210 -0.168544683
[7] -0.232132045 -0.037674359 -0.164510267 -0.123064519 -0.427363710 0.249120454
[13] 0.189818509 -0.125318890 -0.090817036 0.132368681 0.137849210 -0.179389033
[19] -0.251168502 0.284717837 -0.203070939 -0.025723435 0.161473077 0.072130066
[25] 0.001923286 0.028732683 -0.100890265 -0.091261136 0.216944725 0.085688749
[31] 0.151103335
如果我只是寻找值,我会得到适当的答案:
> max(abs(loads.P_Y_wolf_df_2012_pca[ , 6]))
[1] 0.4273637
任何帮助我了解问题根源的帮助将不胜感激。
答案 0 :(得分:2)
我们可以使用apply
避免如下所示的循环:
apply(df,2,function(x) which.max(abs(x)))
如果我们要使用循环(出于计算原因在大多数情况下不建议使用):
res<-vector()
for(i in 1:ncol(df)){
res[i]<-which.max(abs(df[,i]))
}
res
循环的变体:
for(i in 1:ncol(df)){
res[i]<-which(abs(df[,i])==max(abs(df[,i])))
}
res
使用sapply
:
sapply(df,function(x) which.max(abs(x)))
根据@akrun的建议,我们也可以使用max.col
结果:
apply
(提供更多信息):
PC1 PC2 PC3 PC4 PC5 PC6
6 5 2 6 3 3
显式循环:
[1] 6 5 2 6 3 3
使用max.col
:
max.col(t(abs(df)), 'first')
[1] 6 5 2 6 3 3
使用sapply
:
PC1 PC2 PC3 PC4 PC5 PC6
6 5 2 6 3 3
使用purrr
:
purrr::map_dbl(df,function(x) which.max(abs(x)))
PC1 PC2 PC3 PC4 PC5 PC6
6 5 2 6 3 3