【问题标题】:Randomly divide df in list of df into equal subsets [duplicate]将df列表中的df随机划分为相等的子集[重复]
【发布时间】:2020-02-07 22:38:50
【问题描述】:

昨天我已经问了一个类似的问题:R - Randomly split a dataframe in n equal pieces

我得到的答案几乎是我所需要的,但仍然存在问题。我还考虑了其​​他不同的方法来获得结果。

这是我的示例 df-list:

set.seed(0L)
AB_df = data.frame(replicate(2,sample(0:130,1624,rep=TRUE)))
BC_df = data.frame(replicate(2,sample(0:130,1656,rep=TRUE)))
DE_df = data.frame(replicate(2,sample(0:130,1656,rep=TRUE)))
FG_df = data.frame(replicate(2,sample(0:130,1729,rep=TRUE)))

AB_pc = data.frame(replicate(2,sample(0:130,1624,rep=TRUE)))
BC_pc = data.frame(replicate(2,sample(0:130,1656,rep=TRUE)))
DE_pc = data.frame(replicate(2,sample(0:130,1656,rep=TRUE)))
FG_pc = data.frame(replicate(2,sample(0:130,1729,rep=TRUE)))

df_list = list(AB_df, BC_df, DE_df, FG_df, AB_pc, BC_pc, DE_pc, FG_pc)
names(df_list) = c("AB_df", "BC_df", "DE_df", "FG_df", "AB_pc", "BC_pc", "DE_pc", "FG_pc")

我想将列表中的单个 df 随机子集为 n 个相等的部分(或尽可能接近相等)。我已经从 chinsoon12 那里得到了一个非常有用的答案:

new = lapply(df_list, function(df) {
  n <- nrow(df)
  split(df, cut(sample(n), seq(1, n, by=floor(n/4)), labels=FALSE, include.lowest=TRUE))})

问题在于它不适用于任何数量的行,也没有考虑到所有观察结果。例如。当我使用该方法将我的 df_list 划分为 5 个子集时,我得到 AB_df 的 325、324、324、324、324 子集,总共不是 1624,所以缺少一些东西。当我将它分成 4 个部分时,我只得到 3 个子集……知道为什么会这样吗?

我还考虑了在列表中拆分 df 的 2 种不同方法。一种方法可能是通过以随机方式更改行的顺序来随机重新排列观察结果:

for (a in 1:length(df_list)) {
  df_list[[a]] = df_list[[a]][sample(nrow(df_list[[a]])),]}

现在我只需要将 dfs 分成 n 块……但这就是我不知道该怎么做的地方。

我想到的第三种方法是为 n 个子样本创建一个随机数字列表 1:n 并将它们添加到数据帧中,然后根据数字提取 df。

我仍然认为第一种方法是最简单的,我更喜欢这个。知道代码有什么问题吗?

【问题讨论】:

  • >当我将它分成 4 个部分时,我只得到 3 个子集......知道为什么会这样吗?发生这种情况是因为 cut 从字面上看,在您告诉它的边缘上将您的值等分地削减。所以给出 4 个边会产生 3 个间隔。
  • 请不要就同一主题提出重复的问题 - 如果第一个问题没有让您满意,它仍然有效,您可以对其进行编辑以提供说明和详细信息。
  • 是的,对不起,你是对的。我真的很想得到答案。我真的会尽量避免这种情况。

标签: r list random subsampling


【解决方案1】:

导致您的团队规模不同的问题是一个切入点。它总是需要在一侧有一个硬间隔边界,我真的不知道如何在你的情况下做到这一点。 你可以用gl 解决你的问题,忽略警告。 当您在应用之前随机化生成的关卡时,您就在那里。

set.seed(0L)
AB_df = data.frame(replicate(2,sample(0:130,1624,rep=TRUE)))
BC_df = data.frame(replicate(2,sample(0:130,1656,rep=TRUE)))
DE_df = data.frame(replicate(2,sample(0:130,1656,rep=TRUE)))
FG_df = data.frame(replicate(2,sample(0:130,1729,rep=TRUE)))

AB_pc = data.frame(replicate(2,sample(0:130,1624,rep=TRUE)))
BC_pc = data.frame(replicate(2,sample(0:130,1656,rep=TRUE)))
DE_pc = data.frame(replicate(2,sample(0:130,1656,rep=TRUE)))
FG_pc = data.frame(replicate(2,sample(0:130,1729,rep=TRUE)))

df_list = list(AB_df, BC_df, DE_df, FG_df, AB_pc, BC_pc, DE_pc, FG_pc)
names(df_list) = c("AB_df", "BC_df", "DE_df", "FG_df", "AB_pc", "BC_pc", "DE_pc", "FG_pc")

#the number of groups you want to generate
subs <- 4

splittedList <-  lapply(df_list,
                        function(df){
                          idx <- gl(n = subs,round(nrow(df)/subs))
                          split(df, sample(idx))# randomize the groups
                        })
#> Warning in split.default(x = seq_len(nrow(x)), f = f, drop = drop, ...):
#> data length is not a multiple of split variable

#> Warning in split.default(x = seq_len(nrow(x)), f = f, drop = drop, ...):
#> data length is not a multiple of split variable

## the groups are appr. equally sized:
lapply(splittedList,function(l){sapply(l,nrow)})
#> $AB_df
#>   1   2   3   4 
#> 406 406 406 406 
#> 
#> $BC_df
#>   1   2   3   4 
#> 414 414 414 414 
#> 
#> $DE_df
#>   1   2   3   4 
#> 414 414 414 414 
#> 
#> $FG_df
#>   1   2   3   4 
#> 432 432 433 432 
#> 
#> $AB_pc
#>   1   2   3   4 
#> 406 406 406 406 
#> 
#> $BC_pc
#>   1   2   3   4 
#> 414 414 414 414 
#> 
#> $DE_pc
#>   1   2   3   4 
#> 414 414 414 414 
#> 
#> $FG_pc
#>   1   2   3   4 
#> 432 432 433 432

## and the sizes are right:
sapply(df_list,nrow)
#> AB_df BC_df DE_df FG_df AB_pc BC_pc DE_pc FG_pc 
#>  1624  1656  1656  1729  1624  1656  1656  1729

sapply(splittedList,function(l){sum(sapply(l,nrow))})
#> AB_df BC_df DE_df FG_df AB_pc BC_pc DE_pc FG_pc 
#>  1624  1656  1656  1729  1624  1656  1656  1729

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 2018-02-18
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    相关资源
    最近更新 更多