Вам нужно прочитать определенные строки текстового файла, который не имеет большого формата, во фрейм данных (предпочтительно несколько фреймов данных)? - PullRequest
0 голосов
/ 18 февраля 2019

Я совершенно новичок в 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, но у меня есть некоторый опыт программирования, поэтому мне не обязательно, чтобы кто-то точно говорил мне, как это сделать, но если бы кто-то мог, по крайней мере, указать мне правильное направление любых функций, на которые я должен смотреть »буду очень признателен за помощь!

1 Ответ

0 голосов
/ 18 февраля 2019

Шаг 1: Получить данные в сеансе R с помощью readLines

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» вызовет множество других элегантных примеров подобного подхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...