是否需要将特定格式的文本文件读入数据框(最好是多个数据框)中?

时间:2019-02-18 16:49:19

标签: r

我对R完全陌生,我不确定处理该文件的最佳方法,因此我真的希望有人至少可以指出我正确的方向。我已经搜索了其他解决方案,并尝试使用grepl,但似乎无法找出仅读取某些数据的最佳方法。我尝试读取的文件看起来像下面的文本:

##BLOCKS= 8          
Plate:  Plate01 1.3 PlateFormat Endpoint    Absorbance  Raw FALSE   1               1   630 1   12  96  1   8   None    
Temperature(°C) 1       2       3       4       5       6       7       8       9       10      11      12      
0.00            0.042   0.067   0.292   0.206   0.071   0.067   0.04    0.063   0.059   0.04    0.066   0.04        
                0.043   0.172   0.179   0.199   0.073   0.067   0.04    0.062   0.058   0.039   0.066   0.039       
                 0.04   0.066   0.29    0.185   0.072   0.067   0.04    0.062   0.058   0.039   0.065   0.039       
                0.039   0.068   0.291   0.189   0.075   0.069   0.04    0.064   0.058   0.041   0.064   0.039       
                0.042   0.063   0.271   0.191   0.07    0.068   0.04    0.065   0.058   0.041   0.066   0.04        
                0.041   0.067   0.342   0.199   0.069   0.066   0.041   0.065   0.057   0.04    0.065   0.042       
                0.044   0.064   0.295   0.198   0.069   0.067   0.039   0.064   0.057   0.04    0.067   0.041       
                0.041   0.067   0.29    0.211   0.066   0.067   0.043   0.056   0.058   0.042   0.067   0.042       

~End
Plate:  Plate#1 1.3 PlateFormat Endpoint    Absorbance  Raw FALSE   1                       1   630 1   12  96  1   8   None    
Temperature(°C) 1       2       3       4       5       6       7       8       9       10      11      12      
0.00            0.042   0.072   0.257   0.165   0.074   0.07    0.04    0.067   0.055   0.04    0.07    0.04        
                0.042   0.164   0.136   0.195   0.075   0.07    0.041   0.066   0.055   0.04    0.069   0.04        
                0.041   0.07    0.344   0.198   0.074   0.069   0.041   0.065   0.055   0.04    0.068   0.04        
                0.04    0.069   0.307   0.199   0.075   0.072   0.041   0.067   0.055   0.043   0.068   0.041       
                0.043   0.068   0.296   0.214   0.072   0.071   0.042   0.067   0.055   0.041   0.068   0.041       
                0.041   0.071   0.452   0.241   0.072   0.069   0.042   0.067   0.054   0.041   0.068   0.043       
                0.044   0.068   0.299   0.182   0.071   0.071   0.042   0.067   0.054   0.041   0.069   0.041       
                0.042   0.071   0.333   0.13    0.068   0.07    0.042   0.058   0.054   0.042   0.07    0.041       

~End

我只希望编号为1-12的列/行(温度旁边)及其下的数据。我是R的新手,但确实有一定的编程经验,所以我不一定需要有人确切地告诉我如何执行此操作,但是如果有人至少可以将我指出的正确方向,我应该关注的是我, d非常感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

第1步:使用readLines将数据放入R会话

Lines <- readLines(textConnection("##BLOCKS= 8          
Plate:  Plate01 1.3 PlateFormat Endpoint    Absorbance  Raw FALSE   1               1   630 1   12  96  1   8   None    
Temperature(°C) 1       2       3       4       5       6       7       8       9       10      11      12      
0.00            0.042   0.067   0.292   0.206   0.071   0.067   0.04    0.063   0.059   0.04    0.066   0.04        
                0.043   0.172   0.179   0.199   0.073   0.067   0.04    0.062   0.058   0.039   0.066   0.039       
                 0.04   0.066   0.29    0.185   0.072   0.067   0.04    0.062   0.058   0.039   0.065   0.039       
                0.039   0.068   0.291   0.189   0.075   0.069   0.04    0.064   0.058   0.041   0.064   0.039       
                0.042   0.063   0.271   0.191   0.07    0.068   0.04    0.065   0.058   0.041   0.066   0.04        
                0.041   0.067   0.342   0.199   0.069   0.066   0.041   0.065   0.057   0.04    0.065   0.042       
                0.044   0.064   0.295   0.198   0.069   0.067   0.039   0.064   0.057   0.04    0.067   0.041       
                0.041   0.067   0.29    0.211   0.066   0.067   0.043   0.056   0.058   0.042   0.067   0.042       

~End
Plate:  Plate#1 1.3 PlateFormat Endpoint    Absorbance  Raw FALSE   1                       1   630 1   12  96  1   8   None    
Temperature(°C) 1       2       3       4       5       6       7       8       9       10      11      12      
0.00            0.042   0.072   0.257   0.165   0.074   0.07    0.04    0.067   0.055   0.04    0.07    0.04        
                0.042   0.164   0.136   0.195   0.075   0.07    0.041   0.066   0.055   0.04    0.069   0.04        
                0.041   0.07    0.344   0.198   0.074   0.069   0.041   0.065   0.055   0.04    0.068   0.04        
                0.04    0.069   0.307   0.199   0.075   0.072   0.041   0.067   0.055   0.043   0.068   0.041       
                0.043   0.068   0.296   0.214   0.072   0.071   0.042   0.067   0.055   0.041   0.068   0.041       
                0.041   0.071   0.452   0.241   0.072   0.069   0.042   0.067   0.054   0.041   0.068   0.043       
                0.044   0.068   0.299   0.182   0.071   0.071   0.042   0.067   0.054   0.041   0.069   0.041       
                0.042   0.071   0.333   0.13    0.068   0.07    0.042   0.058   0.054   0.042   0.07    0.041       

~End"))

第2步和第3步:构建条件以包括良好的数据行并分组

?strsplit 
# Couldn't remember name of `substr`, figured the ?strsplit  page would show link

start <- substr(Lines, 1,1)  # 1st char was sufficient to build a rule
table(start)
#--- result ----
start
       #  ~  0  P  T      # the 14 is the count of " " (just spaces)
 2 14  1  2  2  2  2 
#end table
goodL <- Lines[start %in% c(" ","T","0")  ]
goodL  # Look at result

group <- cumsum(substr(goodL , 1,4)=="Temp")  #build grouping
group   # check the grouping variable
 [1] 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2

第4步:使用lapply(split(goodL, group), function(x) ...

处理组
dfrms <- lapply(split(goodL, group), 
             function(x) read.table(text=substr(x,16,  # stuff to right of 16th char
                                                     100),header=TRUE))
str(dfrms)  # check result,,, not correct, need 12th entry
List of 2
 $ 1:'data.frame':  8 obs. of  11 variables:
  ..$ X1 : num [1:8] 0.042 0.043 0.04 0.039 0.042 0.041 0.044 0.041
  ..$ X2 : num [1:8] 0.067 0.172 0.066 0.068 0.063 0.067 0.064 0.067
 #   -----snipped output

 dfrms <- lapply(split(goodL, group),   # will be a list of dataframes
            function(x) read.table(text =substr(x, 16, 120), header=TRUE))
 str(dfrms)   # Looks good
List of 2
 $ 1:'data.frame':  8 obs. of  12 variables:
  ..$ X1 : num [1:8] 0.042 0.043 0.04 0.039 0.042 0.041 0.044 0.041
  ..$ X2 : num [1:8] 0.067 0.172 0.066 0.068 0.063 0.067 0.064 0.067
  ..$ X3 : num [1:8] 0.292 0.179 0.29 0.291 0.271 0.342 0.295 0.29
 #--- snippped output

我想将这一策略归功于@ G.Grothendieck。在“ user:516548 readLines”上进行搜索将获得许多其他类似方法的优雅示例。