使用R查找值进行文本挖掘

时间:2014-03-27 03:41:10

标签: r text-mining

我有一个长文件,其中存储了不同参数的值。这是一个非常简单的数据示例。 C5以上有几行。我想找到ISVEGISDISP的值。我发现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"
)

3 个答案:

答案 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