找到数据框中的最大值索引并添加该值

时间:2014-03-29 03:20:14

标签: r


这是我的数据框:

>head(dat)
  geno    P1    P2    P3    P4   dif
1   G1 0.015 0.007 0.026 0.951 0.001
2   G2 0.008 0.006 0.015 0.970 0.001
3   G3 0.009 0.006 0.017 0.968 0.000
4   G4 0.011 0.007 0.017 0.965 0.000
5   G5 0.013 0.005 0.021 0.961 0.000
6   G6 0.009 0.006 0.007 0.977 0.001

在这里,我需要在每一行中找到max并将max $ dif添加到最大值。
当我使用which.max(dat[,-1])时,我收到错误:

Error in which.max(dat[,-1]) : 
  (list) object cannot be coerced to type 'double'

2 个答案:

答案 0 :(得分:1)

之前的答案(由Scriven提供)提供了大部分内容,但正如其他人所说,它错误地包含了最后一列。这是一种解决它的方法:

idx <- (! names(dat) %in% c('geno','dif'))
dat$dif + apply(dat[,idx], 1, max)
#     1     2     3     4     5     6 
# 0.952 0.971 0.968 0.965 0.961 0.978 

您可以轻松地将idx内容直接放入dat[,...]子集中,但为了清楚起见,我在此处将其分解。

idx可由此处的众多内容定义,例如&#34; 除了第一列和最后一列&#34;:idx <- names(dat)[-c(1, ncol(dat))];或&#34; 任何看起来像P#&#34;:idx <- grep('^P[0-9]+', names(dat))

答案 1 :(得分:0)

有一个app,呃功能:-)。

max.col找到矩阵每行的最大位置索引。请注意,由于 max.col 需要矩阵(仅限数值),因此在应用此函数时必须排除“geno”列。

sapply(1:6,function(x) dat[x,max.col(dat[,2:5])[x] +1]) + dat$dif
[1] 0.952 0.971 0.968 0.965 0.961 0.978