发现在一排的列数和值的第二最高值(Finding the column number and val

2019-06-23 21:29发布

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

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)

理想情况下,解决方案将不涉及删除任何原始数据,可用于寻找第三,第四......最高值,但这些都不是必不可少的要求。

Answer 1:

试试这个:

# 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

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



文章来源: Finding the column number and value the of second highest value in a row
标签: r dataframe plyr