发现在一排的列数和值的第二最高值

我试图写一些代码标识最大的两个值的每一行,并提供他们的列数和价值。

df = data.frame( car = c (2,1,1,1,0), bus = c (0,2,0,1,0), walk = c (0,3,2,0,0), bike = c(0,4,0,0,1))

我已经成功地得到它使用的最大值这样做maxmax.col功能。

df$max = max.col(df,ties.method="first")

df$val = apply(df[ ,1:4], 1, max)

据我知道有没有类似功能的第二高值,这样做会让事情变得有点棘手。 使用这个代码提供的第二高值,但(重要)不与关系的情况。 此外,它看起来有风险的。

sec.fun <- function (x) { max( x[x!=max(x)] ) }

df$val2 <- apply(df[ ,1:4], 1, sec.fun)

理想的是,溶液不会涉及除去任何原始数据,并可以用来找到第三,第四......最高值,但这些都不是必不可少的要求。

谢谢阅读。

--------------解决方案-------------

尝试这个:

# a function that returns the position of n-th largest
maxn <- function(n) function(x) order(x, decreasing = TRUE)[n]

这是一个封闭,所以你可以使用这样的:

> # position of the largest
> apply(df, 1, maxn(1))
[1] 1 4 3 1 4
> # position of the 2nd largest
> apply(df, 1, maxn(2))
[1] 2 3 1 2 1
>
> # value of the largest
> apply(df, 1, function(x)x[maxn(1)(x)])
[1] 2 4 2 1 1
> # value of the 2nd largest
> apply(df, 1, function(x)x[maxn(2)(x)])
[1] 0 3 1 1 0

更新

为什么使用封闭在这里?

原因之一是,你可以定义一个函数,如:

max2 <- maxn(2)
max3 <- maxn(3)

然后,用它

> apply(df, 1, max2)
[1] 2 3 1 2 1
> apply(df, 1, max3)
[1] 3 2 2 3 2

我不知道,如果优势很明显,但我喜欢这种方式,因为这是更多的功能十岁上下的方式。

分类:ř 时间:2015-03-16 人气:7
本文关键词: data.frame,plyr
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 2.677 (s). 10 q(s)