【问题标题】:R read from file different-sized arraysR从文件不同大小的数组中读取
【发布时间】:2011-12-07 20:32:13
【问题描述】:

我需要将 R 中的 Mann Kendall 趋势检验应用于大量(约 100 万)不同大小的时间序列。我已经创建了一个脚本,它从某个目录中的所有文件中获取时间序列(实际上是一个数字列表),然后将结果输出到一个 .txt 文件。

问题是我有大约 100 万个时间序列,因此创建 100 万个文件并不是很好。所以我认为将所有时间序列放在一个 .txt 文件中(例如,用“#”之类的符号分隔)可能更易于管理。所以我有一个这样的文件:

1
2
4
5
4
#
2
13
34
#
...

我想知道,是否可以在 R 中提取这样的系列(在两个“#”之间)然后应用分析?

编辑

按照@acesnap 提示,我正在使用此代码:

library(Kendall)
a=read.table("to_r.txt")
numData=1017135

for (i in 1:numData){

s1=subset(a,a$V1==i)
m=MannKendall(s1$V2)
cat(m[[1]],"  ",m[[2]], "  ", m[[3]],"  ",m[[4]],"  ", m[[5]], "\n" ,   file="monotonic_trend_checking.txt",append=TRUE)
}

这种方法有效,但问题是计算需要很长时间。您能建议一种更快的方法吗?

【问题讨论】:

  • 如果您有新问题,最好的办法是重新发布一个新问题。特别是因为已经有一个公认的答案。
  • @PaulHiemstra 我会听从你的提示
  • 这是否可以加速取决于瓶颈是什么。如果是循环,您可以查看 data.table 包中的 data.table 。如果是 MannKendall 测试,那么加快速度可能会有点困难。
  • 您可以使用以下方法对循环的不同部分进行计时: # 开始计时! ptm

标签: file list r size


【解决方案1】:

如果您要在数据集进入较大文件时对其进行编号,这会使事情变得更容易。如果你要这样做,你可以使用 for 循环和子集。

setNum        data
  1            1
  1            2
  1            4
  1            5
  1            4
  2            2
  2           13
  2           34
 ...          ...

然后执行以下操作:

answers1 <- c()  
numOfDataSets <- 1000000
for(i in 1:numOfDataSets){
  ss1 <- subset(bigData, bigData$setNum == i) ## creates subset of each data set
  ans1 <- mannKendallTrendTest(ss1$data)      ## gets answer from test
  answers1 <- c(answers1, ans1)               ## inserts answer into vector
  print(paste(i, " | ", ans1, "",sep="" ))    ## prints which data set is in use
  flush.console()                             ## prints to console now instead of waiting
}

【讨论】:

  • 我已按照您的提示进行操作,并且正在使用我发布的代码。问题是它太慢了。你能推荐点别的吗?
【解决方案2】:

这可能是一个更优雅的解决方案:

# Read in your data
x=c('1','2','3','4','5','#','4','5','5','6','#','3','6','23','#')
# Build a list of indices where you want to split by:
ind=c(0,which(x=='#'))
# Use those indices split the vector into a list
lapply(seq(length(ind)-1),function (y) as.numeric(x[(ind[y]+1):(ind[y+1]-1)]))

请注意,要使此代码正常工作,文件末尾必须有一个“#”字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-26
    • 2018-08-31
    • 2013-09-12
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多