Создать столбец во фрейме данных R со вторым по величине значением в каждой строке

Извините, если я задаю тривиальный вопрос, но дело в том, что я провел несколько часов, читая ответы в этой базе данных, и не смог найти то, что ищу.

У меня есть кадр данных, похожий на этот

df=data.frame(v1=c(24,15, 0, 7,36,10), c1=c(22,15,0,0,28,11), v2=c(0,10,0,19,0,0), c2=c(0,7,0,22,0,0), v3=c(54,22,28,55,62,38), c3=c(44,23,22,66,71,44))

(В оригинале, конечно, строк и столбцов гораздо больше)

Я хотел бы создать два столбца с максимальным и вторым по величине значением всех столбцов «v».

Для максимума это работает:

df$max.v=mapply(FUN=max, df$v1, df$v2, df$v3, na.rm=TRUE)

Но я не могу найти способ сделать это для второго по величине значения. Наверное, нужна какая-то функция, но я не нашел, как это сделать.


person josumezo    schedule 19.07.2013    source источник
comment
Дубликат: stackoverflow.com/q/10296866/946850   -  person krlmlr    schedule 19.07.2013


Ответы (1)


Обратите внимание, что принятый ответ на вопрос, связанный с @krlmlr, сомнительный, потому что apply может сломать кадры данных. В данном случае это не имеет большого значения, потому что все столбцы должны быть числовыми, чтобы вопрос имел смысл, но я предпочитаю ошибаться на всякий случай.

Вместо этого используйте do.call с mapply и убедите его рассматривать df как список:

do.call(mapply, c(function(...) sort(c(...), dec=TRUE)[1:2],
        df[grepl("v", names(df))]))
person Hong Ooi    schedule 19.07.2013
comment
Я думаю, что ОП хотел, чтобы учитывались только столбцы v. Таким образом, последний аргумент будет лучше, чем df[grepl("v",names(df))] - person James; 19.07.2013
comment
Большое спасибо. Я впечатлен и смиренно осознаю, как мало я еще знаю о R. - person josumezo; 19.07.2013
comment
Поскольку я не знаю, как создать два столбца за один раз, я адаптировал ваш код, скопировав все и заменив [1:2] на [1] в первом столбце и [2] на другом. Это прекрасно работает. - person josumezo; 19.07.2013