将数据帧按对应于一个国家的所有行进行切片,然后对该向量进行采样 我有一个R脚本,通过命令行()函数读取一些参数,以查看在将这些切片保存到由C++程序解释的文本文件之前,它应该在数据集中生成什么样的切片。 该数据集是在欧盟进行的一项调查,我希望能够通过将commandArgs向量中的相关参数与包含所有可能选项的字符串向量countries进行比较,对每个受访者的国家进行切片。使用该矩阵和相应的整数矩阵CountryIndex,其中包含每个国家的边界(即:所有比利时通讯员都在第1-1043行,因此CountryIndex[1,1]=1和CountryIndex[2,1]=1043),我希望构建一个具有所有相关边界的矩阵PersonIndicates,使用which()函数
从这里,我想做一个向量,其中包含来自被请求国家的指数样本。此向量的大小可以是将数据帧按对应于一个国家的所有行进行切片,然后对该向量进行采样 我有一个R脚本,通过命令行()函数读取一些参数,以查看在将这些切片保存到由C++程序解释的文本文件之前,它应该在数据集中生成什么样的切片。 该数据集是在欧盟进行的一项调查,我希望能够通过将commandArgs向量中的相关参数与包含所有可能选项的字符串向量countries进行比较,对每个受访者的国家进行切片。使用该矩阵和相应的整数矩阵CountryIndex,其中包含每个国家的边界(即:所有比利时通讯员都在第1-1043行,因此CountryIndex[1,1]=1和CountryIndex[2,1]=1043),我希望构建一个具有所有相关边界的矩阵PersonIndicates,使用which()函数,r,dataframe,logical-operators,subset,R,Dataframe,Logical Operators,Subset,从这里,我想做一个向量,其中包含来自被请求国家的指数样本。此向量的大小可以是sampleSize*sampleCountries(每个国家的采样人数),也可以是sampleSize,具体取决于传递的另一个参数。我希望,至少对于后一种类型的采样,我可以通过c()函数一次性生成这个向量,如下所示 personIndices<-rbind(c(1,1043),c(2044,3061),c(8423,8922)) sampleVector<-c(personIndices[,1]:perso
sampleSize*sampleCountries
(每个国家的采样人数),也可以是sampleSize
,具体取决于传递的另一个参数。我希望,至少对于后一种类型的采样,我可以通过c()函数一次性生成这个向量,如下所示
personIndices<-rbind(c(1,1043),c(2044,3061),c(8423,8922))
sampleVector<-c(personIndices[,1]:personIndices[,2])
PersonIndicates我将您的代码总结为:
如果sampleType
为TRUE
,则从sampleCountries
中每个国家对应的指数中抽取一个大小sampleSize
的样本,并将所有这些样本指数一起返回
如果sampleType
为FALSE
,则将sampleCountries
中所有国家对应的指数分组,并抽取一个大小为sampleSize
的单一样本
让我们设置一些示例参数:
sampleCountries <- c("BE", "WG")
sampleSize <- 20
sampleType <- F
接下来,当“所有”
位于sampleCountries
中时,您希望表现得像选择了所有国家一样:
if ("ALL" %in% sampleCountries) {
sampleCountries <- unique(countries)
}
if(“所有”%in%sampleCountries){
样本国家
使用添加到数据中的新“国家”字段(因子),逻辑索引和子集设置是您真正需要的
您只需允许用户执行以下操作:
从列表中选择一个国家(通过选择其编号、两个字母的缩写,无论什么)
…然后从该国的数据集中采样。仅此而已
dat$country我会在数据集中添加一个新的列,指明行所属的国家,然后通过该列对数据子集进行操作,而不是维护一个完全不必要的CountryIndexes矩阵。使用一个新的“country”字段(因子),您只需要逻辑索引/子集你添加到你的数据中。看看我的答案。就像@6pool所说的那样,+1向下投票并不酷,这是一个真正的问题,是受欢迎的。在我开始时,我遇到了类似的问题“获取”R的习惯用法进行逻辑索引。但是,OP,根据解决方案,你能将问题浓缩并将其从“我正在尝试用变量Y做X,然后索引到Z”以及更广泛的“这是我想用这个数据集做的事情”非常感谢!这是非常优雅的:)
if ("ALL" %in% sampleCountries) {
sampleCountries <- unique(countries)
}
if (sampleType) {
personIndices <- unlist(lapply(sampleCountries, function(x) {
return(sample(which(countries == x), sampleSize, replace=F))
}))
} else {
personIndices <- sample(which(countries %in% sampleCountries), sampleSize,
replace=F)
}
dat$country <- NA # insert a new column, initialize to NA for pessimism, to catch omissions
dat$country[1:1043,] <- 'Belgium'
dat$country[2044:3061,] <- 'Bulgaria'
dat$country[8423,8922,] <- 'Czech Rep'
...
# Now make country a factor instead of character
dat$country <- as.factor(dat$country)
# Now you can sample() using either logical indexing...
sample(dat[dat$country=='Bulgaria',] , ...)
# ...or subsetting
sample(subset(dat,country=='Bulgaria'), ...)