我有以下数据框:
d <- data.frame(a=c(1,2,3,4), b=c(20,19,18,17))
row.names(d) <- c("A", "B", "C", "D")
我想要另一个 data.frame,具有相同的列和 2 行,其中包含该列中 2 个最小元素的行名称。
在该示例中,预期结果为:
# Expected results
exp <- data.frame(a=c("A", "B"), b=c("C","D"))
最佳答案
我们使用lapply
循环遍历列,对值进行排序
,使用该索引对对应的row.names的
,并用 n
进行子集化'd' 的 data.frame
包裹起来
n <- 2
data.frame(lapply(d, function(x) sort(head(row.names(d)[order(x)], n))))
-输出
# a b
#1 A C
#2 B D
在 R 4.1.0
中,我们还可以使用 |>
运算符将函数与 \一起链接(按顺序应用以便于理解) (x)
- 用于 base R
# // ordered the column values
# // get corresponding row names
lapply(d, \(x) row.names(d)[order(x)] |>
head(n) |> # // get the first n values
sort()) |> # // sort them
data.frame() # // convert the list to data.frame
# a b
#1 A C
#2 B D
或者使用dplyr
library(dplyr)
d %>%
summarise(across(everything(),
~ sort(head(row.names(d)[order(.)], n))))
# a b
#1 A C
#2 B D
关于最小元素的行名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67655280/