将数据帧按对应于一个国家的所有行进行切片,然后对该向量进行采样 我有一个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'), ...)