более быстрый способ создания новых переменных, содержащих фреймы данных, для объединения - PullRequest
0 голосов
/ 04 октября 2019

Я хочу создать кучу новых переменных a, b, c, d ..... z для хранения фреймов данных. Затем я свяжу новые переменные, в которых хранятся фреймы данных, и экспортирую их как CSV. Как мне сделать это быстрее без необходимости каждый раз указывать новые переменные?

a<- subset(data.frame, variable1="condition1",....,) %>% group_by() %>% summarize( a=mean())
b<-subset(data.frame, variable1="condition2",....,) %>% group_by() %>% summarize( a=mean())
....

z<-subset(data.frame, variable1="condition2",....,) %>% group_by() %>% summarize( a=mean())

rbind(a,b,....,z)

Должен быть более быстрый способ сделать это. У меня большой набор данных, поэтому его хранение в памяти в виде разделов a, b, c, .... z приводит к сбою компьютера. Набирать подмножества условий для многократного формирования разделов утомительно.

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Вы можете сделать что-то подобное, используя пакет purrr:

Возможно, вам придется использовать NSE в зависимости от вашего состояния. Вы можете ссылаться на Программирование с помощью dplyr

purrr::map_df(
    c("condition1","condition2",..., "conditionn"), 
    # .x for each condition
    ~ subset(your_data_frame, variable1=.x,....,) %>% group_by(some_columns) %>% summarise(a = mean(some_columns))
)

Пример использования iris:

library(rlang)
conditions <- c("Petal.Length>1.5","Species == 'setosa'","Sepal.Length > 5")
map(conditions, function(x){
    iris %>% 
        dplyr::filter(!!rlang::parse_expr(x)) %>%
        head()
})

Пример использования iris:

conditions <- c("Petal.Length>1.5","Species == 'setosa'","Sepal.Length > 5")
map(conditions, ~ iris %>% dplyr::filter(!!rlang::parse_expr(.x)) %>% nrow())
# or (!! is almost equivalent to eval or rlang::eval_tidy())
map(conditions, ~ iris %>% dplyr::filter(eval(rlang::parse_expr(.x))) %>% nrow())
[[1]]
[1] 113

[[2]]
[1] 50

[[3]]
[1] 118
0 голосов
/ 04 октября 2019

Вместо создания нескольких объектов в глобальном окружении скопируйте их в list и свяжите его

library(data.table)
files <- list.files(pattern = "\\.csv", full.names = TRUE)
rbindlist(lapply(files, fread))

С fread это было бы намного быстрее, чем в любом другом параметре


Если мы используем строки для передачи на group_by, преобразуем строку в символ с помощью sym из rlang и оцениваем (!!)

library(purrr)
map2_df(c("condition1", "condition2"), c("a", "b") ~ df1 %>%
                      group_by(!! rlang::sym(.x)) %>%
                      summarise(!! .y := mean(colname)))

Если'condition1', 'condition2' и т. д. являются выражениями, поместите его как quosure и оцените его

map2_df(quos(condition1, condition2), c("a", "b"), ~ df1 %>%
                 filter(!! .x) %>%
                  summarise(!! .y := mean(colnames)))

Используя воспроизводимый пример

conditions <- quos(Petal.Length>1.5,Species == 'setosa',Sepal.Length > 5) 
map2(conditions, c('a', 'b', 'c'), ~ 
           iris %>% 
                filter(!! .x)  %>%
                summarise(!! .y := mean(Sepal.Length)))
#[[1]]
#         a
#1 6.124779

#[[2]]
#      b
#1 5.006

#[[3]]
#         c
#1 6.129661

Это будет 3набор данных столбца, если мы используем map2_dfc

ПРИМЕЧАНИЕ. Неясно, означал ли OP «условие1», «условие2» как выражения, передаваемые для filter строк или нет.

...