由于我对R相对较新,我想用它来格式化一个文件中的大量数据(+30,000个唯一ID),并在另一个文件中以不同格式重写它们。 我在解决某种R行为方面遇到了很大的问题。由于案例的复杂性,我共享一个包含示例文件的Dropbox文件夹。这就是我想要实现的目标:
我希望将文件格式化为" Final Product.dat"这是空格分隔的(但它必须严格保持与此处相同的间距,否则我正在运行的东西将无法运行!)。 因此,在文件的第一行有一个名为" HUXXX ... 1"这将从1到+30,000,然后接下来的5行将始终相同,然后有数据。 因此,从2到4的行写在一个单独的文件(SHead);对于我在" header.txt"中写的整行5。 对于第一行,我创建了另一个名为ID-s100的文件,其中包含" HUXXXX"加上ID列。我正在使用某种" sprintf"在这种情况下(参见dropbox中附带的代码)。 数据在" S100.txt&#34 ;;请注意,我已将ID设为第一列。
我的代码类型工作但在每个ID内将重复整个ID的相同值。例如,对于ID = 1而不是创建一个HU0000001和一个配置文件(如" Final Product.dat"),它将创建12次HU00001和相同的数据,然后对ID 2执行相同的操作。 我想要的是" Final Product.dat"是:一个独特的HUXXXXXN,以及下面每个HUXXXXN的对应数据(应该与ID列匹配)。 有人能帮我吗?我现在很难让代码处理我可以从互联网上找到的反馈,我想我可能需要一些见解。
https://www.dropbox.com/sh/5gxpw0dy2brahho/AADirGyvMUjkTDPbO4fJmlLBa?dl=0
由于我理解需要在此处编写代码和数据,因此我尽量做到最好:
我希望"最终产品"将看起来应该是好的: 第一行的粗体是我在每个ID
之后要改变的东西* HU00000001 AAAA C 150 SOME DEFAULT
所以我有一个名为ID-s100.txt的文件,其中Col 1上的ID和Col 2上的HU编号。
这些行对于每个ID
都是相同的 @ SITE COUNTRY LAT LON SC FL
LCO ................................................. (有些信息请到这里)
@ SCOM SALB SLU1 SLDR SLRO SLNF SLPF SMHB SMPX SMKE
..............................(其他一些信息在这里)
以上四行在SHead.txt文件中读取
然后header.txt如下:
@ SLB SLMH SLLL SDUL SSAT SRGF SSKS SBDM SLOC SLCL SLSI SLCF SLNI SLHW SLHB SCEC SADC
以下数据存储在" s100.csv"和" ksat和srfg.txt"并在第一列上有ID,之后有数据。 " ksat ......"只是一组数据一直重复到最后,下面是第一个ID(第一列......)数据的摘录:
1 10 0.02 0.04 0.12 0.42 4 8 1.4 2.02 6.18
1 20 0.02 0.04 0.12 0.42 4 8 1.4 2.02 6.18
1 30 0.02 0.04 0.12 0.42 4 8 1.4 2.02 6.18
1 40 0.02 0.04 0.12 0.42 4 8 1.4 0.5 5.5
2 5 0.02 0.04 0.12 0.42 3 8 1.4 2.4 5.5
2 10 0.02 0.04 0.12 0.42 3 8 1.4 2.4 5.5
2 20 0.02 0.04 0.12 0.42 3 8 1.4 2.4 5.5
...然后直到+30,000
这是代码:
Library(MASS)
setwd("C:\\....")
s100 = read.csv("C:\\.....\\S100.csv", header=F)
SHead = readLines("SHead.txt")
sID.n= read.table("C:\\.....\\ID-s100.txt",header=F)
sheader= read.table("C:\\.....\\header.txt", header=F)
ksat = read.table("C:\\.....\\Ksat and Srfg.txt", header=F)
m99 <- rep("-99", nrow(s100))
m9df = as.data.frame(m99)
SSAT.n = cbind(s100$V1, s100$V12, s100$V2, m9df, s100$V4, s100$V5, s100$V6, ksat$V1, ksat$V2,
s100$V9, s100$V10, s100$V7, s100$V8, m9df, m9df, s100$V11, m9df, m9df, m9df)
for(id in s100$V1){
SSAT = SSAT.n[s100$V1 == id, 2:19]
shead = as.matrix(sheader, dimnames = NULL)
SSAT[is.na(DSSAT)] <- " "
xxm = as.matrix(DSSAT, dimnames = NULL)
names(xxm) <- names(shead)
t1 = rbind(shead,xxm)
t2 = as.data.frame(t1, dimnames = NULL)
names(t2) = c(" ", " "," "," ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ")
t3 = format(t2, justify = "right", col.names=F, row.names=F, dimnames=NULL)
sID = sID.n[sID.n$V1 == id, 2]
Line2 = paste(sprintf("%1s%1s %5s", "*", sID, " UPSC SCL 140 SOIL PROFILE\n", "\n", sep=""))
file.n = "TRIAL.dat"
con = file(description = paste(file.n), open="a")
writeLines(Line2, con=con, sep= "\n")
writeLines(SoilHead, con = con , sep = "\n" )
write.table(t3, file= con, append = TRUE, quote=F, col.names=FALSE, row.names= F)
close(con)
}
提前感谢您的帮助!