Создание цикла для списка различных фреймов данных - PullRequest
0 голосов
/ 28 января 2019

У меня есть фрейм данных для нескольких дат, который включает в себя фактор регистрации имен (reg) с уровнями, значениями и датами

Reg    Values date
<fctr> <dbl>  <fctr>
1       7     2018-02-01
3       10    2018-02-01
5       15    2018-02-01
1       16    2018-02-01
1       12    2018-02-02
2       5     2018-02-02
3       6     2018-02-02

И я хочу выбрать все значения для 2 случайных уровней для каждой даты.

Я составил список фреймов данных для каждой даты

df_list <- split(df, as.factor(df$date))

создаю функцию и использую lapply для циклического перебора всего фрейма данных

rando <- (function (x){
subset(x,reg %in% sample(levels(x$reg), 2, replace = TRUE))
}

Result <- lapply(df_list, rando)

Это работает,но выбирайте случайные уровни из всех дат, а не конкретной даты.В результате иногда алгоритм выбирает уровни Reg, которые не представлены в определенном кадре данных.

Желаемый результат

Reg    Values date
<fctr> <dbl>  <fctr>
  1       7     2018-02-01
  5       15    2018-02-01
  1       16    2018-02-01
  2       5     2018-02-02
  3       6     2018-02-02

Можете ли вы объяснить, как выбирать уровни только внутри каждого df из списка?

1 Ответ

0 голосов
/ 28 января 2019

Я бы использовал unique() вместо levels(factor()).Вот несколько вариантов:

Использование data.table:

library(data.table)
setDT(df)[, .SD[Reg %in% sample(unique(Reg), size = 2)], by = date]

Необработанный перевод на dplyr:

library(dplyr)
df %>%
  group_by(date) %>%
  filter(Reg %in% sample(unique(Reg), size = 2))

И в текущий рабочий процесс в base R:

do.call(
  rbind,
  lapply(df_list, function(X) X[X$Reg %in% sample(unique(X$Reg), size = 2), ])
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...