我有一个数据框类似于 -
Name State A B C
Tom NY 4 2 5
Dick IL 8 1 3
Harry WI 2 6 4
John MD 5 4 9
我想创建一个数据帧列表,其中每个数据帧按 A
或 B
或 C
排序,生成的数据帧包含Name
、State
列和排序依据的列。
lst
$`A`
Name State A
Dick IL 8
Tom NY 4
John MD 5
Harry WI 2
$`B`
Name State B
Harry WI 6
John MD 4
Tom NY 2
Dick IL 1
$`C`
Name State C
John MD 9
Tom NY 5
Harry WI 4
Dick IL 3
我正在尝试使用 lapply -
lst = lapply(df[sapply(df, is.numeric)], function(x){df[order(-x), ]})
但我对如何获得我想要的列感到困惑。
最佳答案
我们可以使用 map
遍历列名 'A'、'B'、'C',使用 select
和 对数据集的列进行子集化arrange
(这里用的是arrange_at
)根据循环列降序排列
library(tidyverse)
out <- map(LETTERS[1:3], ~ df1 %>%
select(Name, State, .x) %>%
arrange_at(.x, desc))
out
#[[1]]
# Name State A
#1 Dick IL 8
#2 John MD 5
#3 Tom NY 4
#4 Harry WI 2
#[[2]]
# Name State B
#1 Harry WI 6
#2 John MD 4
#3 Tom NY 2
#4 Dick IL 1
#[[3]]
# Name State C
#1 John MD 9
#2 Tom NY 5
#3 Harry WI 4
#4 Dick IL 3
names(out) <- names(df1)[3:5]
以防万一,我们必须自动检查 numeric
列,然后使用 select_if
并提取名称
df1 %>%
select_if(is.numeric) %>%
names %>%
map(~ df1 %>%
select(Name, State, .x) %>%
arrange(desc(!! rlang::sym(.x)))) # another way to evaluate from symbol
或者使用 base R
中的 lapply
lapply(names(df1)[3:5], function(x) df1[order(-df1[[x]]), c("Name", "State", x)])
关于r - 创建数据框列表,每个数据框在不同的列上排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51071200/