【问题标题】:Weird filtering/matching behavior in a data.frame in RR中data.frame中奇怪的过滤/匹配行为
【发布时间】:2019-10-29 04:55:23
【问题描述】:

我有一个包含 31 列和 31 个观察值的 data.frame。 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

我在这里只复制前六个变量以及前 5 个观察值。

以下是我正在尝试的循环和相对错误。

> 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

任何帮助让我了解问题所在将不胜感激。

【问题讨论】:

  • 你到底想做什么?目前,您的问题更多地集中在“您的”代码上,我认为这更适合代码审查。相关:X-Y problem.
  • 问题的第二段:我想从我的df的前13列中提取具有最大绝对值的观察位置索引
  • 为什么不使用which.max and somehow combine it with abs`??
  • 这是否接近您的需要? apply(df,2,function(x) which.max(abs(x)))?
  • 谢谢。 which.max 似乎工作正常,我仍然无法理解为什么我以前的代码不起作用。

标签: r for-loop subset


【解决方案1】:

我们可以使用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 循环的变体:

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  

【讨论】:

  • 谢谢,已添加。第一次见到max.col
猜你喜欢
  • 2015-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
相关资源
最近更新 更多