如何 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]
题目中的数据集是一个matrix
(cbind
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"
您可以使用 dplyr
的 filter
,仅提取总和为 %in%
顶部 (head
) 两个总和值的那些行,然后 pull
城市矢量
library(dplyr)
df %>% filter(sum %in% head(sum, 2)) %>% pull(city)
[1] "LA" "NY"
下面有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]
题目中的数据集是一个matrix
(cbind
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"
您可以使用 dplyr
的 filter
,仅提取总和为 %in%
顶部 (head
) 两个总和值的那些行,然后 pull
城市矢量
library(dplyr)
df %>% filter(sum %in% head(sum, 2)) %>% pull(city)
[1] "LA" "NY"