从原始数据的随机样本创建新数据框

时间:2017-06-13 02:54:13

标签: r for-loop dplyr

我从原始数据框中随机抽样参与者,然后我想创建新的数据框,不包括一个样本并保留其余部分(只需注意数据框要大得多,有更多变量和每个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。

1 个答案:

答案 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