我从原始数据框中随机抽样参与者,然后我想创建新的数据框,不包括一个样本并保留其余部分(只需注意数据框要大得多,有更多变量和每个id的更多观察)。
示例df:
id var1 var2
1 10 15
1 10 15
2 11 4
2 11 4
3 12 4
3 12 4
4 9 10
4 9 10
#randomly sample two sets of id
id <- as.numeric(as.character(df$id))
fold1 <- as.data.frame(sample(id, 2, replace=TRUE))
colnames(fold1) <- "id"
fold2 <- as.data.frame(sample(id, 2, replace=TRUE))
colnames(fold2) <- "id"
期望的输出
df.new1:
id var1 var2
2 11 4
2 11 4
3 12 4
3 12 4
df.new2:
id var1 var2
1 10 15
1 10 15
4 9 10
4 9 10
我尝试了这些方面的东西,但似乎我的语法有些问题我无法弄明白。如果有一个dplyr实现,我会很高兴看到它。
list = c(fold1, fold2)
for(i in length(list)) {
df.new <- as.data.frame(df[!(df$id %in% list[i]$id), ])
assign(paste("df.new", i, sep="."), df.new)
}
**编辑:我略微修改了这个例子,以反映每个绘制应该采样一部分id总数的事实,总的来说,id的采样数应该等于df中id的总数。因此,如果有4个id,则每个绘图应包含2个id。
答案 0 :(得分:1)
示例如果您有一个示例数据,每个都有60个ID,其中包含一个值:
df <- data.frame(id=1:60, val=sample(rep(letters, 3), 60))
获取5个子集数据的ID,每个数据包含12个ID:
set.seed(1)
draw <- sample(1:60, 60, replace=FALSE)
id <- split(draw, rep(1:5, each=12))
使用lapply基于id:
进行子集化output <- lapply(id, function(x)df[df$id %in% x, ])
#e.g.
output[[1]]
# id val
# 4 4 y
# 9 9 f
# 11 11 x
# 12 12 e
# 16 16 o
# 22 22 o
# 33 33 d
# 34 34 n
# 36 36 r
# 50 50 s
# 52 52 p
# 57 57 p