2014-03-27 1 views
1

다른 매개 변수의 값이 저장되는 긴 파일이 있습니다. 다음은 데이터의 아주 간단한 예입니다. C5 위에 몇 줄이 있습니다. ISVEGISDISP 값을 찾고 싶습니다. 나는 ISVEG의 가치를 찾기 위해 MATLAB에 대한 명령을 발견하지만 난 R codeR을 사용하여 값을 찾는 텍스트 마이닝

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 (샘플 데이터)는이 내가 생각 해낸 것입니다

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

파일의 텍스트 조직/형식의 어떤 종류가 있습니까 : 이것은 당신에게 관심 분야와 dataframe을 제공 을 (그렇지 않을 경우, 관심있는 선을 잘라 몇 가지 코드를 추가)? 의미, 그것은 어떤 구조화 된 형태로 들어갈 수 있을까요? 그것은 당신의 견본에서 그렇게 보이지 않습니다. –

+0

@RichardScriven 데이터가 구조화 된 형식이 아닌 것 같습니다. –

답변

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 
1

다음은 내가 생각해 낸 것입니다. 얻으려는 값은 모두 0이고 다른 0이 있기 때문에 찾고있는 값을 10과 5로 바꾸고 동일한 형식의 다른 행 (C7)에 값 20과 8을 추가합니다 (for 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" 

여기 인수로서 read.csv로부터 판독 단일 열data.frame을 취하는 함수이다 :


여기서 텍스트이다. 여기

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 
+0

정말 고마워요. 그것은 작동합니다. –

+0

문제 없습니다. 다행 당신을 위해 작동합니다. –

+0

이것은 큰 텍스트 파일에서 작동하는 기능으로 바뀔 수 있습니다. –

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 
+0

감사합니다.내 실제 텍스트에는 C5 이전에 많은 행이 있으므로이 방법을 사용하려면 추가 코드가 필요합니다. –

+0

그러면 관심있는 라인 만 잘라내어 선물하기 위해 라인 하나 또는 두 개가 필요합니다. 당신이 발견 한 것처럼 텍스트 처리는 R의 힘이 아닙니다. 직관적이지 않은 약간의 이름으로 일부 기능이 있다고 확신합니다. 나는 지금 바쁘다. 그러나 나는 나중에 그것을 볼 것이다. – smci

관련 문제