使用colnames&amp ;;返回第一个在数据框行中出现的第二大值应用

时间:2016-04-19 09:01:56

标签: r

考虑我有一个df

> editor
          A  B  C  D  E  F  G  H  I  J
User1     1  0  5  6  5  6  5  6  2  6
User2     0  5  4  6  4  5  5  1  7  5

我想在上面的行中存储第一个出现的第二大值的列名。 预期结果

> editor
          A  B  C  D  E  F  G  H  I  J  2nd_highest
User1     1  0  5  6  5  6  5  6  2  6      C
User2     0  5  4  6  4  5  5  1  7  5      D

我试过了edited$2nd_highest <- colnames(edited)[apply(edited, 1, which.max)+1],但确实效果不好。

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

这是尝试使用代数来实现这一点,以便保持矢量化并避免行操作(尽管它仍然进行类似于apply的矩阵转换)。这里的想法是找到最大值 - 然后从数据集中减少它,然后转换为log(乘以-1后),这将导致最大值变为-Inf(意味着最小值) )然后执行1/result以查找剩余值中的最大值。

indx <- max.col(1/log((editor - editor[cbind(1:nrow(editor), 
                max.col(editor))]) * -1), ties.method = "first")
names(editor)[indx]
# [1] "C" "D"

答案 1 :(得分:3)

这是一个想法。我们首先对每行的setInterval值进行排序,然后提取第二个值。由于我们指定unique,因此第二个值将是第二个最高值。然后,我们使用新列表中每个元素的第一个值作为列名

的索引
decreasing = TRUE

答案 2 :(得分:2)

这可以帮到你:

mat <- matrix(sample(1:8, 24, replace=TRUE), ncol=6)
mat
sec_highest <- apply(mat, 1, function(x) which(x == max(x[which(x != max(x))])))
LETTERS[sec_highest] # letters display

请注意,如果您有两个具有相同分数的第二个高分,则只会显示一个。