Создать список фреймов данных, каждый из которых отсортирован по разным столбцам. - PullRequest
0 голосов
/ 27 июня 2018

У меня есть датафрейм, похожий на -

 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), ]})

но я застреваю на том, как получить нужные мне столбцы.

1 Ответ

0 голосов
/ 27 июня 2018

Мы могли бы использовать 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

Или используя lapply из base R

lapply(names(df1)[3:5], function(x) df1[order(-df1[[x]]), c("Name", "State", x)])
...