【问题标题】:For Loop over Lapply (or using map2)For Loop over Lapply(或使用 map2)
【发布时间】:2018-11-29 00:24:34
【问题描述】:

您好,我正在尝试遍历数据帧列表并从数据帧中提取不同大小的样本。例如,对于 df1,我想要一个大小为 10 的样本,df2 是一个大小为 8 的样本,等等。我曾与 Melissa Key 在我之前提出的问题上合作开发以下代码:

sampler <- function(df, n,...) {
  return(df[sample(x=nrow(df),n),])
}

#for(i in 1:totalstratum){
sample_list<-lapply(population_list,sampler,n=stratum_sizes[i,1])
#}

#or
library(purrr)
sample_list<-map2(population_list, stratum_sizes,sampler)

其中stratum_sizes是一个向量{4,5,3,2,10,10,8}和totalstratum=nrow(stratum_sizes),它也等于列表population_list中的元素个数。

到目前为止,我能够获得一个样本,但从来没有正确的观察次数。有任何想法吗?提前感谢您的帮助!

【问题讨论】:

  • 你能举个例子说明什么不起作用,包括你得到什么输出和你想要什么输出?例如,map2(list(mtcars, iris), c(4,5), sampler) 正如您在问题中提出的那样对我来说运行良好,但我不知道您是否期望不同的输出。

标签: r for-loop random lapply sample


【解决方案1】:

我假设您想从存储在list 中的data.frames 中抽取一定数量的

下面使用map2怎么样:

# Generate sample data
# Here: A list of three data.frames
set.seed(2017);
lst <- lapply(1:3, function(x) data.frame(val1 = runif(20), val2 = runif(20)))

# Define the sample sizes for every data.frame in the list
ssize <- c(10, 5, 3)

# Sample ssize entries from every data.frame in the list
map2(ssize, lst, ~ .y[sample(nrow(.y), .x), ])
#[[1]]
#         val1      val2
#16 0.38868193 0.6500038
#8  0.43490560 0.3191046
#11 0.67433148 0.8838444
#7  0.03932234 0.6204450
#2  0.53717641 0.3798674
#3  0.46919565 0.9420740
#19 0.94099988 0.1771317
#5  0.77008816 0.2276118
#10 0.27383312 0.2608393
#14 0.43207779 0.2117630
#
#[[2]]
#        val1      val2
#12 0.8835366 0.6904628
#4  0.0791699 0.7512366
#6  0.5096950 0.4699963
#19 0.5393251 0.4123170
#20 0.9229542 0.9327490
#
#[[3]]
#        val1      val2
#4  0.9204118 0.1926415
#15 0.8373573 0.9309950
#8  0.1653395 0.5895154

【讨论】:

  • 谢谢!这正是我想要的代码,但是当我这样做时,我得到了所有样本大小,都带有四个观察值。我的 ssize 向量的等价物有 ssize[1]=4。您对为什么会发生这种情况有任何见解吗?提前致谢。
  • @pestopasta ssize 应该与data.frames 中的list 具有相同的length。在我给出的示例中,我在lst 中从第一行采样 10 行,从第二行采样 5 行,从第三行采样 3 行data.frame
  • - 当我重新运行我的代码时,它工作了 - 非常感谢 Maurits Evers!
  • @pestopasta 这可能不关我的事,但正如 Bob 所说,“所以实际上不赞成 cmets 说“谢谢”;如果它解决了您的问题,您可以继续点击复选标记(当 SO 允许时)"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2012-07-17
  • 1970-01-01
相关资源
最近更新 更多