【问题标题】:Loop for applying mask and creating a vector of means用于应用掩码和创建均值向量的循环
【发布时间】:2013-08-08 09:34:59
【问题描述】:

我想在对多个文本文件 (1,408) 应用掩码后创建一个均值向量。每个文件对应一个变量和 1950-2013 年的年份,因此该变量有 64 个文件,并且有 22 个变量。这是我在 R 中应用的编码:

dataDir <- "C:\\dir\\"
patternC <-"Var1_"
filesSizeC = sort(list.files(dataDir,patternC))

  for (i in 1:length(filesSizeC)) {
   theData<-read.table(paste(dataDir,filesSizeC[i],sep=""),header=F,sep=",")
}

mask <- read.csv("http://dl.dropbox.com/s/2tbffe65i53afj1/examplemask.txt",
header=F)

product <- mask * theData
product[product == 0] <- NA
mean(product$V1, na.rm=TRUE)

这仅给了我一个值,即 64 个文本文件的平均值。但我想要应用屏蔽后每个文本文件的平均值。我修改了编码,试图给我一个每年的手段向量:

for (i in 1:length(filesSizeC)) {
theData<-read.table(paste(dataDir,filesSizeC[i],sep=""),header=F,sep="\t")  
pdt <- mask*theData

if (i>0) {
    theMeanValues <- c(theMeanValues,mean(pdt))

  } else {
  theMeanValues <- c(mean(pdt))
 }
}

错误信息是:

Error: object 'theMeanValues' not found

我不太确定如何将其更改为我想要的。

所以本质上我想实现这个:

year | Var1_Masked_Mean | Var2_Masked_Mean | etc...
1950
1951
 .
 .
 .
2013

我希望我的问题是有道理的!

谢谢

【问题讨论】:

  • 能否提供可重现的示例数据集?

标签: r loops


【解决方案1】:

在您的示例中,R 的索引为 1 而不是 0...

for (i in 1:length(filesSizeC)) {

所以改变这个

if (i>0) {
  ...
  }

if (i>1) {
  ...
  }

在循环的第一次迭代中,当i==1 你将创建theMeanValues 变量。

【讨论】:

  • 谢谢。当我返回 theMeanValues 时,它返回 64 个 NA,我该如何获取这些值?
  • @hgeop 你记得放mean( pdt , na.rm = TRUE )吗?!
  • 抱歉,我需要输入 mean(pdt$V1, na.rm=T),它现在可以工作了。感谢您的帮助@SimonO101
【解决方案2】:

你必须用类似的东西初始化theMeanValues

theMeanValues <- vector(length=length(filesSizeC))

然后您可以将每次迭代的结果mean(pdt) 存储到该向量中的某个位置:

theMeanValues[i] <- mean(pdt)

这将防止错误并且比在每次迭代中使用c() 增加theMeanValues 向量更有效。

但是,听起来您可能想要初始化一个矩阵并从您的 for-loop 的每次迭代中提取一个向量......但您的问题并不清楚。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-24
    • 2022-01-03
    • 2019-04-30
    • 1970-01-01
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多