作者andrew43 (讨厌有好心推文後删文者)
看板R_Language
标题Re: [问题] 两层for回圈问题
时间Wed Jun 6 11:08:45 2018
我不是很明白 nc 档你想怎麽处理,
所以这篇只简单说明一次读入多个 nc 档怎麽把它们「储存在同一个 list 里面」。
假设有 2 * 24 个 nc 档案,档名叫
01-00.nc 01-01.nc 01-02.nc ... 01-23.nc 02-00.nc ... 02-23.nc
library(magrittr)
library(stringr)
library(ncdf4)
dt <-
data.frame(
day = gl(2, 24, labels = (1:2) %>% str_pad(2, pad = "0")),
hour = gl(24, 1, labels = (0:23) %>% str_pad(2, pad = "0"))
)
dt$filename <- paste0(dt$day, "-", dt$hour, ".nc")
nc.res <- vector("list", nrow(dt))
names(nc.res) <- dt$filename
for(i in dt$filename){
nc.res[[i]] <- nc_open(i)
}
则 nc.res 为所求,而 dt 可方便对照档名与日期时间。
之後对 nc.res 的呼叫就和一般 list 一样了,
例如 nc.res[[1]] 或 nc.res$`01-00.nc` 之类的。
你也可能需要用到 lapply() 方便操作 list。
※ 引述《AndrewShi (没有你的我)》之铭言:
: [问题类型]:
: 程式谘询(我想用R 做某件事情,但是我不知道要怎麽用R 写出来)
: [软体熟悉度]:
: 入门(写过其他程式,只是对语法不熟悉)
: [问题叙述]:
: 我想要读多笔名称相近的时间资料(nc档)进R,资料的时间长度为一小时一笔,而我想要
: 读2天共48笔资料进R,因此需写两层for回圈(分别为日期和小时),我的程式码如下,虽然
: 过程中没有出现error,但读进来的资料日期和小时是交错的(环境叙述中的图,只有24笔
: )所以想请问该如何解决??谢谢。
: 资料名称唯一的差别在於#precip那行的"01"(日期)和"00"(小时)。
: [程式范例]:
: rm(list=ls())
: library(ncdf4)
: day=c("01","02")
: hour=c("00","01","02","03","04","05","06","07","08","09","10",11:23)
: class(day)
: class(hour)
: nc<-list()
: for(i in c(1:2)){
: for(j in c(0:23)){
: precip.file<-paste("C:\\Users\\TOM\\Desktop\\R(资料库
: )\\201505\\gsmap_mvk.201505",paste(day[i=(1:2)]),paste("."),
: paste(hour[j=(0:23)],paste("00.v6.4133.0.nc")),sep="")
: #precip<-"C:\\Users\\TOM\\Desktop\\R(资料库
: )\\20150501\\gsmap_mvk.201505"01"."00"00.v6.4133.0.nc"
: #nc[i,j]=rbind(i,j)
: }
: i<-i+1
: nc[i,j]<-nc_open(precip.file)
: }
: precip.file
: View(matrix(precip.file))
: [环境叙述]:
: 执行画面拍照截图於推文中
: [关键字]:
: 两层for回圈 nc档 读取多笔资料
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.248.222.1
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1528254529.A.9B0.html
1F:推 AndrewShi: 谢谢andrew大~我会再好好研究的,不过我不太懂str_pad( 06/06 17:34
2F:→ AndrewShi: 2,pad="0")这行是什麽意思?? 06/06 17:34
3F:→ andrew43: 补上前缀0。多练习自己看说明手册 ?str_pad 06/06 18:00
4F:推 AndrewShi: 另外想请问dt$filename里没有i这个变数名称,最後在写f 06/06 18:05
5F:→ AndrewShi: or回圈读资料进来的时候应该没办法读吧?!(实际操作後 06/06 18:05
6F:→ AndrewShi: 的确出现error,没办法读进来) 06/06 18:05
7F:→ andrew43: 我的for loop里i就是一次一次的dt$filename没错 06/06 18:21
8F:→ andrew43: 你要怎麽让for loop运作可自行调整 06/06 18:22
9F:推 wayturn: 如果要读多档,可先存档名再回圈读档,关键字:file.list 06/06 19:33
10F:推 AndrewShi: 好的,我再研究看看,谢谢你们~ 06/06 21:55
11F:推 AndrewShi: andrew大~我改成这样但好像也只有读到最後一笔资料, 06/10 01:09
12F:→ AndrewShi: 能否请你再次指点我改如何改才能完整的把48笔资料都读 06/10 01:09
13F:→ AndrewShi: 进来呢??谢谢。 06/10 01:09
15F:→ andrew43: nc.res 後面要双重中跨号 06/10 22:08
16F:→ andrew43: 他是一个list。 06/10 22:08
17F:→ andrew43: 还有问题可以回文并附上可重复问题的code,推文太久会 06/10 22:19
18F:→ andrew43: 漏看。 06/10 22:19
19F:推 AndrewShi: 了解,我解决了,忘记print也要放在for回圈里,谢谢and 06/11 02:20
20F:→ AndrewShi: rew大~另外可以请教andrew大,gl指令(我有看说明)和写f 06/11 02:20
21F:→ AndrewShi: or回圈的意思(重复动作)是差不多的吗?!如果是差不多的 06/11 02:20
22F:→ AndrewShi: ,能否顺便想请问你我最一开始的code可以经过修改而达 06/11 02:20
23F:→ AndrewShi: 到同样的功用吗??谢谢。 06/11 02:20
24F:→ andrew43: 你看过说明手册吗? 输入 ?gl 06/11 08:04
25F:推 AndrewShi: 有~你们整理的指令表里面也有,只是感觉它的功能跟for 06/11 17:28
26F:→ AndrewShi: 回圈很像,不太清楚它在意义上有什麽差别。 06/11 17:28
27F:→ andrew43: gl和for风马牛不相及。 06/11 17:46
28F:→ andrew43: 若没明白gl是什麽意思,看手册推敲gl(3,2,12)是什麽结果 06/11 17:48
29F:推 AndrewShi: 以三个分类变数,每个执行2次,列出前12笔?! 06/12 17:15
30F:→ andrew43: 差不多了。产生一个因子,有3类,每次2个重覆,共12个 06/12 20:15
31F:推 AndrewShi: 了解,谢谢andrew大~ 06/13 22:50