我有一个用于多个日期的数据框,其中包括带有级别,值和日期的注册名称(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内部选择级别吗?
答案 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), ])
)