【发布时间】:2018-06-18 22:04:01
【问题描述】:
我正在尝试编写一个接受数据帧的函数,然后在 for() 循环中生成子数据帧。作为第一步,我尝试了以下方法:
dfcreator<-function(X,Z){
for(i in 1:Z){
df<-subset(X,Stratum==Z) #build dataframe from observations where index=value
assign(paste0("pop", Z),df) #name dataframe
}
}
但是,这不会将任何内容保存到内存中,当我尝试指定 return() 时,我仍然没有得到我需要的东西。作为参考,我正在使用 瑞典数据集(RStudio 原生)。
根据 Melissa 的建议进行编辑!
我尝试实现以下代码:
sampler <- function(df, n,...) {
return(df[sample(nrow(df),n),])
}
sample_list<-map2(data_list, stratumSizeVec, sampler)
其中 stratumSizeVec 是 1X7 df,data_list 是七个 df 的列表。当我这样做时,我会在样本列表中得到七个样本,它们的大小都等于stratumSizeVec[1]。为什么map2没有按以下方式输入
sampler(data_list$pop0,stratumSizeVec[1])
sampler(data_list$pop1,stratumSizeVec[2])
...
sampler(data_list$pop6,stratumSizeVec[7])
此外,有没有办法将 map2 函数“嵌套”在 lapply 中?
【问题讨论】:
-
从长远来看,像这样创建一堆变量会使它们更难使用。最好使用
split()之类的东西来创建data.frames 列表。这将使 R 中的许多函数更快乐。在函数中创建的变量将不存在于该函数之外。最好将返回值的函数编写为适当的函数式语言。同样,从长远来看,它会让事情变得更容易。 -
list2env(setNames(split(X,X$Stratum),paste0("pop",unique(X$Stratum))))