r - 创建数据框列表,每个数据框在不同的列上排序

标签 r lapply

我有一个数据框类似于 -

 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

我想创建一个数据帧列表,其中每个数据帧按 ABC 排序,生成的数据帧包含NameState 列和排序依据的列。

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/

相关文章:

r - 映射列表并将变量插入到函数中

r - 迭代 R 中的模式 grep 函数

r - 可以在管道中使用 data.table rbindlist

r - 复杂的汇总功能-是否可以使用R data.table包解决?

r - 将偏移量参数传递给 lm 函数

r - 使用列表中的对象作为 lapply 中的函数参数

r - 将 row_number() 分配为 R 中数据帧列表上的列值

r - 将用户定义的函数应用于数据框列表

r - 使用 R 中 update() 中的变量来更新公式

sql - 在日期中查找简单的频率模式