найдите индекс максимального значения в кадре данных и добавьте значение

61
3


Это мой кадр данных:

>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 в каждой строке и добавить dat $ dif to max.
когда я использовал which.max(dat[,-1]), я получаю ошибку:

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

спросил(а) 2014-03-29T06:20:00+04:00 5 лет, 8 месяцев назад
2
Решение
45

Предыдущий ответ (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 может быть определено здесь многими вещами, такими как "все, кроме первого и последнего столбцов": idx <- names(dat)[-c(1, ncol(dat))]; или "все, что похоже на P #": idx <- grep('^P[0-9]+', names(dat)).

ответил(а) 2014-03-29T08:44:00+04:00 5 лет, 8 месяцев назад
Еще 1 ответ
33

Там приложение, и функция для этого :-).

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

ответил(а) 2014-03-29T13:20:00+04:00 5 лет, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема