2017-02-21 5 views
0

Для следующего кадра данных:R имя возврата колонки в зависимости от условий

DF <- data.frame(Row=c(1,2,3,4,5),`2.04`=c(1,1,0,1,1),`2.05`=c(0,0,0,0,1), 
     `2.06`=c(1,0,0,0,1),`2.07`=c(1,0,0,0,1),`2.08`=c(1,1,1,0,0), check.names = F) 

я хотел бы вернуться в новый вектор для каждой строки имени столбца, который имеет как оба (а) значение больше 0 в соответствующей строке; (Б) имя столбца имеет наибольшее значение всех тех, которые удовлетворяют условие а, таким образом, что:

DF <- data.frame(Row=c(1,2,3,4,5),'2.04'=c(1,1,0,0,1),'2.05'=c(0,0,0,0,1), 
       '2.06'=c(1,0,0,0,1),'2.07'=c(1,0,0,1,1),'2.08'=c(1,1,1,0,0), 
       Results=c(2.08,2.08,2.08,2.04,2.07) 

Таким образом, для строки 2 столбцов 2,04 и 2,08 встречается условие (а), и только 2.08 удовлетворяет условие (б) потому что 2.08> 2.04.

dplyr или data.table было бы предпочтительно.

ответ

3

Вы также можете использовать max.col как этот

DF$results <- names(DF[-1])[max.col(DF[-1], "last")] 
DF 
    Row 2.04 2.05 2.06 2.07 2.08 results 
1 1 1 0 1 1 1 2.08 
2 2 1 0 0 0 1 2.08 
3 3 0 0 0 0 1 2.08 
4 4 1 0 0 0 0 2.04 
5 5 1 1 1 1 0 2.07 

max.col возвращает позицию столбца максимального значения для каждой строки. Требуется второй аргумент: ties.method, который установлен для «last» здесь, чтобы вернуть наибольшую позицию столбца для каждой строки. Эти позиции столбцов используются для извлечения имен столбцов с помощью [, которые затем преобразуются в числовые и помещаются в вектор.

+0

Удивительно, почему люди не поддерживают оптимальное решение – akrun

2

Мы можем использовать строку apply и получить names для всех столбцов, значение которых больше 0 и получить max.

DF$Results <- apply(DF[-1], 1, function(x) max(names(which(x >0)))) 

DF 
# Row 2.04 2.05 2.06 2.07 2.08 Results 
#1 1 1 0 1 1 1 2.08 
#2 2 1 0 0 0 1 2.08 
#3 3 0 0 0 0 1 2.08 
#4 4 1 0 0 0 0 2.04 
#5 5 1 1 1 1 0 2.07 

 Смежные вопросы

  • Нет связанных вопросов^_^