【发布时间】:2021-10-28 06:49:40
【问题描述】:
我的意见:
df <- data.frame("foo"=1, "bar"=2, "baz"=3, "gaz"=12, "taz"=14, "paz"=4)
我想在它们所在的第一行和列名中获得 3 个最大值。所以我希望得到这样的东西taz,gaz,paz.
我尝试pmax,slice_max 没有成功
【问题讨论】:
我的意见:
df <- data.frame("foo"=1, "bar"=2, "baz"=3, "gaz"=12, "taz"=14, "paz"=4)
我想在它们所在的第一行和列名中获得 3 个最大值。所以我希望得到这样的东西taz,gaz,paz.
我尝试pmax,slice_max 没有成功
【问题讨论】:
如果你的 data.frame 真的只有一行,你可以使用
library(dplyr)
library(tidyr)
df %>%
pivot_longer(everything()) %>%
slice_max(value, n = 3)
返回
# A tibble: 3 x 2
name value
<chr> <dbl>
1 taz 14
2 gaz 12
3 paz 4
否则,您要么必须进行一些过滤,要么将行号与一些分组结合使用。
【讨论】:
这里有一个带有apply 的选项,可以对df 中的每一行执行此操作。
apply(df, 1, function(x) names(head(sort(x, decreasing = TRUE), 3)))
# [,1]
#[1,] "taz"
#[2,] "gaz"
#[3,] "paz"
如果你需要值和列名,你可以返回一个列表。
apply(df, 1, function(x) {
x <- head(sort(x, decreasing = TRUE), 3)
list(value = as.numeric(x), name = names(x))
})
#[[1]]
#[[1]]$value
#[1] 14 12 4
#[[1]]$name
#[1] "taz" "gaz" "paz"
【讨论】:
我们可以在base R 中使用stack 和order
out <- stack(df)[2:1]
head(out[order(-out$values),], 3)
ind values
5 taz 14
4 gaz 12
6 paz 4
【讨论】:
我们可以试试这个
> df[order(-unlist(df))[1:3]]
taz gaz paz
1 14 12 4
【讨论】: