为不同数据帧的列表创建循环

时间:2019-01-28 08:17:35

标签: r

我有一个用于多个日期的数据框,其中包括带有级别,值和日期的注册名称(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 :(得分:1)

我将使用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), ])
)