我有一个长文件,其中存储了不同参数的值。这是一个非常简单的数据示例。 C5
以上有几行。我想找到ISVEG
和ISDISP
的值。我发现matlab的命令可以找到ISVEG
的值,但我无法将其更改为R code
C5 MOMENTUM ADVEC AND HORIZ DIFF SWITCHES AND MISC SWITCHES
*
*
C5 ISCDMA ISAHMF ISDISP ISWASP ISDRY ISQQ ISRLID ISVEG ISVEGL ISITB ISEVER IINTPG
0 1 0 0 -99 1 0 0 0 0 0 0
C6 Testing
*
*
C6 par1 par2
10 12
Matlab代码:
% inpfile is the file where the above sample data is stored
fid=fopen(inpfile,'r');
%C5
linestr = getstring(fid,'C5');
linestr = getstring(fid,'C5');
linestr = fgets(fid);
val = str2num(linestr);
isveg = val(8);
我认为我们可以使用readLines
但是在读完这些内容后我被困住了。我使用正则表达式吗?
sampledata <- readLines("sampledata.txt")
添加了dput(sampledata)
dput(sampledata)
c(" C5 MOMENTUM ADVEC AND HORIZ DIFF SWITCHES AND MISC SWITCHES",
" *", " *", " C5 ISCDMA ISAHMF ISDISP ISWASP ISDRY ISQQ ISRLID ISVEG ISVEGL ISITB ISEVER IINTPG",
" 0 1 0 0 -99 1 0 0 0 0 0 0",
" C6 Testing", " * ", " *", " C6 par1 par2 ", " 10 12"
)
答案 0 :(得分:1)
这就是我想出的。由于您尝试获取的值都是零,并且还有其他零,因此我将您要查找的值切换为10和5,并添加了具有值20和8的相同格式的另一行(C7)(对于ISDISP和ISVEG,分别)。 这是一个函数,它可能适用于整个文件(前提是格式在感兴趣的行的所有上相同)。
以下是文字:
text <- "C5 MOMENTUM ADVEC AND HORIZ DIFF SWITCHES AND MISC SWITCHES
*
*
C5 ISCDMA ISAHMF ISDISP ISWASP ISDRY ISQQ ISRLID ISVEG ISVEGL ISITB ISEVER IINTPG
0 1 10 0 -99 1 0 5 0 0 0 0
C6 Testing
*
*
C6 par1 par2
10 12
**
C7 ISCDMA ISAHMF ISDISP ISWASP ISDRY ISQQ ISRLID ISVEG ISVEGL ISITB ISEVER IINTPG
0 1 20 0 -99 1 0 8 0 0 0 0"
这是函数,它将data.frame
的单列 read.csv
读取作为参数。
valueFinder <-
function(xx)
{
xx[, 1] <- as.character(xx[, 1])
index <- which(sapply(1:nrow(xx), function(i) grep("(ISDISP|ISVEG)", xx[i, ])) == TRUE)
aa <- lapply(index, function(j) unlist(strsplit(xx[j, ], " ")))
ss <- lapply(index, function(z) unlist(strsplit(xx[z+1, ], "[[:space:]]+")))
d <- as.data.frame(do.call(rbind, lapply(1:length(ss), function(w){
ss[[w]][aa[[w]][nzchar(aa[[w]])] == "ISDISP" | aa[[w]][nzchar(aa[[w]])] == "ISVEG"]
})))
rownames(d) <- sapply(aa, function(x) x[1])
colnames(d) <- c("ISDISP", "ISVEG")
return(d)
}
这是结果,显示了值和它们来自哪一行。
> xx <- read.csv(text = text, header = FALSE)
> valueFinder(xx)
## ISDISP ISVEG
## C5 10 5
## C7 20 8
答案 1 :(得分:1)
至少如果感兴趣的文本在第一行,您可以使用read.csv(..., sep='')
。 (如果没有,添加一些代码来切断感兴趣的行)
这会为您提供包含您感兴趣的字段的数据框:
> txt <- read.csv('so.csv', sep='')
> txt
C5 ISCDMA ISAHMF ISDISP ISWASP ISDRY ISQQ ISRLID ISVEG ISVEGL ISITB ISEVER IINTPG
1 0 1 0 0 -99 1 0 0 0 0 0 0 NA
> txt$ISVEG
[1] 0
> txt$ISDISP
[1] 0
> str(txt)
'data.frame': 1 obs. of 13 variables:
$ C5 : int 0
$ ISCDMA: int 1
$ ISAHMF: int 0
$ ISDISP: int 0
$ ISWASP: int -99
$ ISDRY : int 1
$ ISQQ : int 0
$ ISRLID: int 0
$ ISVEG : int 0
$ ISVEGL: int 0
$ ISITB : int 0
$ ISEVER: int 0
$ IINTPG: logi NA
答案 2 :(得分:0)
这就是我想出的。我想知道是否有一个简单的解决方案。
> sampledata <- readLines("C:/Users/jdbaba/sampledata.txt")
Warning message:
In readLines("C:/Users/jdbaba/sampledata.txt") :
incomplete final line found on 'C:/Users/jdbaba/sampledata.txt'
> linestr <- grep(pattern="C5", sampledata)
> linestr
[1] 1 4
# Since I am interested to read values one line below C5 I used linestr[2]+1
> sampledata[linestr[2]+1]
[1] " 0 1 0 0 -99 1 0 0 0 0 0 0"
> temp <- read.table(text=sampledata[linestr[2]+1], sep="")
> temp
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12
1 0 1 0 0 -99 1 0 0 0 0 0 0
> isveg <- as.numeric(temp[8])
> isveg
[1] 0