【问题标题】:Create new data frame from random samples of original data从原始数据的随机样本创建新数据框
【发布时间】:2017-06-13 02:54:13
【问题描述】:

我从原始数据框中随机抽取参与者,然后我想创建新的数据框,排除一个样本并保留其余样本(请注意,数据框要大得多,每个 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。

【问题讨论】:

  • dplyr 具有方法sample_n(采样n 行)和sample_frac(采样一定比例的行)。他们有帮助吗?
  • 我尝试了group_by(id)sample_n,但它似乎不是基于随机抽取的id 进行抽样。但也许有一种方法可以指定它的绘制方式?
  • 您需要多少个这样的数据帧?所有可能的组合?也只是为了确认,您需要一次忽略一个id
  • 我需要绘制 id 的一部分(对不起,我的例子太短了)。因此,如果我有 60 个 id 并想要 5 次平局,我将在每个折叠中有 12 个 id 和 5 次折叠。

标签: r for-loop dplyr


【解决方案1】:

如果你有一个示例数据,每个 id 有 60 个,每个都有一个值:

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))

根据 id 使用 lapply 到子集:

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

【讨论】:

  • 这很棒,因为它可以获取 5 个样本,但是在帖子的最顶部,我提到我实际上想从原始 df 中排除每个子集绘制(因此当前输出正好包含我想从原始 df 中排除的 5 个 dfs)。这有意义吗?
  • 所以你只想要 2 个 data.frames,一个有 5 个 id,另一个有 55 个 id?
  • 5 个数据帧,每个数据帧有 48 个 id(所以随机选择 12 个)
  • lapply(id, function(x) df[!df$id %in% x, ])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2020-04-03
  • 2012-10-20
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
相关资源
最近更新 更多