这是我的数据框:
>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'
答案 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