【发布时间】:2016-06-03 10:47:19
【问题描述】:
对于数据帧df,我想编写一个循环,选择每个id 组的行百分比,从1% 开始,以1% 的间隔增加,一直到原始@987654323 的99% @。在给定id 的百分比样本中选择的行应该是随机的。
从这个数据框开始:
df <- data.frame(id=rep(LETTERS, each=10)[1:50], fruit=sample(c("apple", "orange", "banana"), 50, TRUE))
我希望能够获得如下所示的数据帧,其中 10% 的样本看起来像
df_10per <- data.frame(id=rep(LETTERS, each=1)[1:5], fruit=sample(c("apple", "orange", "banana"), 5, TRUE))
50% 的样本可能看起来像
df_50per <- data.frame(id=rep(LETTERS, each=5)[1:25], fruit=sample(c("apple", "orange", "banana"), 25, TRUE))
我已经尝试了以下
require(dplyr)
for (i in 1:100)
{ i<-(i^-2)
set.seed(123)
df_01per <- df %>%
group_by(id) %>%
sample_frac('i',replace=TRUE) }
但得到错误
size is not a numeric or integer vector
而且我不确定我是否走在正确的轨道上,尽管dplyr 似乎很有希望。这段代码的另一个问题是我不知道如何为循环中的每个新样本创建一个新的df 名称。关于这个问题,添加一个带有百分比样本的新列的循环(用NA 填充未采样的行)也是一个可接受的解决方案。
感谢观看。
【问题讨论】:
-
lapply(seq(.01,1,.01), function(i) df[1:(nrow(df)*i),])您还应该指定如何处理不能完全整除的百分比。 -
plyr::ddply(df, "id", function(d) d[sample(1:nrow(d), 0.1 * nrow(d)), ])
-
@Pierre & @kitman0804(以及潜在的 Google 员工):感谢你们的时间/帮助。我最终使用了以下方法,它可以让我得到一个随机样本(皮埃尔的不是随机的),并让我在每个 id 中得到那个随机样本。 (无法让 kitman 循环):
zz<-list() for (i in 1:100) { i.2<-i/100 df2 <- df %>% group_by(id) %>% sample_frac(i.2,replace=TRUE) df2 zz[[i]]<-df2 } zz这对我有用,评论者可能对其他人有用。