如何 return 一列的行值,使得它们在另一列中的对应值是 R 中最小的 n 个值

how to return row values of a column such that their corresponding value in another column are the smallest n values, in R

下面有df。

df<-cbind(c("LA", "NY", "Rome"),c(1,1,2),c(0,1,0),c(0,1,2),c(1,3,4))
     [city] [c1] [c2] [c3] [sum]
[1,] "LA"   "1"  "0"  "0"  "1" 
[2,] "NY"   "1"  "1"  "1"  "3" 
[3,] "Rome" "2"  "0"  "2"  "4" 

我想比较 sum 列中的值以找到两个最小值。(这里 1,3 按升序排列)
然后 return city 列中的相应值具有相同的顺序。
所以我想要的是:LA, NY

我可以获取行名(我不想要,但我不知道如何获取洛杉矶、纽约:

rownames(df$city[order(df$sum, decreasing = F),][1:2])[1:2]

题目中的数据集是一个matrixcbind returns默认是一个矩阵,矩阵只能有一个类型。因此,整个数据集被转换为character).如果我们需要根据最后一列(第5列)提取第一列的'n'个元素,提取第5列,转换为numeric,使用order得到值的索引升序,然后使用 head 获取 n 顺序索引并使用它来对第一列

进行子集化
n <- 2
df[,1][head(order(as.numeric(df[,5])), n)]
[1] "LA" "NY"

as.data.frame(cbind 是错误的方式,因为列的类型已经更改为 character。最好直接用data.frame

df1 <- data.frame(col1 = ..., col2 = .., col3 = ...)

tidyverse风格,

(df%>%
  as.data.frame %>%
  arrange(sum) %>%
  pull(city))[1:2]

[1] "LA" "NY"

假设 data.frame:

df <- data.frame(city = c("LA", "NY", "Rome"),
                 c1 = c(1,1,2),
                 c2 = c(0,1,0),
                 c3 = c(0,1,2),
                 sum = c(3,1,4))

我们可以使用 %in% 运算符来提取匹配的逻辑索引,并使用它来对您的城市变量进行子集化:

df$city[ df$sum %in% sort(df$sum)[1:2] ]
[1] "LA" "NY"

您可以使用 dplyrfilter,仅提取总和为 %in% 顶部 (head) 两个总和值的那些行,然后 pull城市矢量

library(dplyr)

df %>% filter(sum %in% head(sum, 2)) %>% pull(city)
[1] "LA" "NY"