2013-07-19 58 views
1

对不起,如果我要求一个微不足道的问题,但事实是我已经花了几个小时阅读这个数据库中的答案,并且找不到我在找什么。在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) 

但我不能找到一个方法来做到这一点的第二高值。 它可能需要某种功能,但我找不到如何去做。

+0

重复:http://stackoverflow.com/q/10296866/946850 – krlmlr

回答

1

请注意,由@krlmlr链接的问题中接受的答案是可疑的,因为apply可能会中断数据帧。在这种情况下,这并不重要,因为所有列都必须是数字才能使问题有意义,但我宁愿错在安全的一面。

相反,使用do.callmapply,并说服其治疗DF的列表:

do.call(mapply, c(function(...) sort(c(...), dec=TRUE)[1:2], 
     df[grepl("v", names(df))])) 
+1

我觉得OP只是想要考虑的“v”列。所以最后的论点会更好,因为'df [grepl(“v”,names(df))]' – James

+0

非常感谢。我印象深刻,并且谦虚地意识到我对R还知之甚少。 – josumezo

+0

因为我不知道如何一次创建两列,所以我调整了代码,复制了所有内容,并将[1:2]替换为第一列中的[1],将另一列替换为[2]。它效果很好。 – josumezo

相关问题