简体   繁体   English

使用R从具有多个列的数据框中读取和构造表

[英]Reading and constructing a table from a data frame with multiple columns using R

I would like to read this output file (gibbs_samples) into R and creat a table of between the number of iterations (1- 44) and variances. 我想将此输出文件(gibbs_samples)读入R,并创建一个介于迭代次数(1-44)和方差之间的表。 The final table should be have 10 columns, with each column: 最终表应包含10列,每一列:

"iter","va1","cova12","va2","vc1","covc12","vc2","ev1","cove12","ev2"

to be separated by an empty space: 用空格隔开:

1 0.2319E-01 0.1166E-02 0.9017E-02 0.3545E-01 0.1543E-01 0.1860 0.5173E-01 0.1542E-01 0.2297
2
.
.
44 

Note: 注意:

i) The first 10 lines should be disregarded i)不应忽略前10行

ii) The number 9 in the second column to be removed and every 3 lines should fall in the same row, ii)要删除的第二列中的数字9,并且每3行应位于同一行中,

 example:

          1       9
 0.2319E-01 0.1166E-02 0.9017E-02 0.3545E-01 0.1543E-01 0.1860     0.5173E-01
 0.1542E-01 0.2297    

should form the first row: 应该形成第一行:

1 0.2319E-01 0.1166E-02 0.9017E-02 0.3545E-01 0.1543E-01 0.1860 0.5173E-01 0.1542E-01 0.2297

iii) There is an empty space between the left margin and the numbers iii)左边距和数字之间有一个空白

iv) Some columns (mostly cols 1 and 2) have no empty space between them iv)一些列(主要是列1和2)之间没有空格

example: 例:

      21       9
 0.2331E-01-0.1479E-03 0.7441E-02 0.2520E-01 0.1537E-01 0.5753E-01 0.7325E-01
 0.2136E-01 0.1439    
      22       9
 0.2377E-01-0.2597E-03 0.7385E-02 0.2614E-01 0.1565E-01 0.6142E-01 0.7073E-01
 0.1946E-01 0.1424  

Below is the output file "gibbs_samples": 下面是输出文件“ gibbs_samples”:

          -1       9       4
        1    6    6    1    1
        2    6    6    1    2
        3    6    6    2    2
        4    7    7    1    1
        5    7    7    1    2
        6    7    7    2    2
        7    0    0    1    1
        8    0    0    1    2
        9    0    0    2    2
       1       9
 0.2319E-01 0.1166E-02 0.9017E-02 0.3545E-01 0.1543E-01 0.1860     0.5173E-01
 0.1542E-01 0.2297    
       2       9
 0.2315E-01 0.1457E-02 0.8491E-02 0.3538E-01 0.1838E-01 0.9397E-01 0.6191E-01
 0.1684E-01 0.1538    
       3       9
 0.2311E-01 0.1363E-02 0.8228E-02 0.3032E-01 0.1593E-01 0.7850E-01 0.6831E-01
 0.1998E-01 0.1450    
       4       9
 0.2282E-01 0.1120E-02 0.7982E-02 0.2935E-01 0.1425E-01 0.7046E-01 0.6993E-01
 0.1987E-01 0.1411    
       5       9
 0.2263E-01 0.1138E-02 0.7893E-02 0.2935E-01 0.1524E-01 0.6388E-01 0.7037E-01
 0.1909E-01 0.1439    
       6       9
 0.2202E-01 0.1260E-02 0.7649E-02 0.3002E-01 0.1776E-01 0.6507E-01 0.7196E-01
 0.2067E-01 0.1429    
       7       9
 0.2229E-01 0.9052E-03 0.7424E-02 0.3015E-01 0.1945E-01 0.6771E-01 0.7075E-01
 0.2017E-01 0.1438    
       8       9
 0.2163E-01 0.7266E-03 0.7327E-02 0.3211E-01 0.2199E-01 0.6600E-01 0.7120E-01
 0.1876E-01 0.1458    
       9       9
 0.2134E-01 0.6320E-03 0.7375E-02 0.3316E-01 0.1930E-01 0.6214E-01 0.7083E-01
 0.2038E-01 0.1465    
      10       9
 0.2188E-01 0.8527E-03 0.7504E-02 0.2835E-01 0.1504E-01 0.6133E-01 0.7096E-01
 0.1839E-01 0.1458    
      11       9
 0.2111E-01 0.9058E-03 0.7598E-02 0.2629E-01 0.1543E-01 0.6452E-01 0.7105E-01
 0.2034E-01 0.1450    
      12       9
 0.2129E-01 0.7306E-03 0.7787E-02 0.2844E-01 0.1472E-01 0.6338E-01 0.7284E-01
 0.1831E-01 0.1452    
      13       9
 0.2163E-01 0.7417E-03 0.7484E-02 0.2881E-01 0.1532E-01 0.6110E-01 0.7104E-01
 0.1979E-01 0.1454    
      14       9
 0.2200E-01 0.4375E-03 0.7549E-02 0.3004E-01 0.1674E-01 0.6364E-01 0.7125E-01
 0.1999E-01 0.1432    
      15       9
 0.2189E-01 0.2382E-03 0.7774E-02 0.2962E-01 0.1681E-01 0.6627E-01 0.7203E-01
 0.1894E-01 0.1419    
      16       9
 0.2155E-01 0.2874E-03 0.7529E-02 0.3123E-01 0.1612E-01 0.6113E-01 0.7190E-01
 0.1877E-01 0.1485    
      17       9
 0.2167E-01 0.2198E-03 0.7418E-02 0.3035E-01 0.1574E-01 0.6015E-01 0.7060E-01
 0.1976E-01 0.1484    
      18       9
 0.2257E-01 0.4865E-04 0.7392E-02 0.3082E-01 0.1619E-01 0.5738E-01 0.7020E-01
 0.1838E-01 0.1443    
          19       9
 0.2184E-01 0.1929E-03 0.7315E-02 0.3363E-01 0.1854E-01 0.6592E-01 0.7136E-01
 0.1890E-01 0.1466    
      20       9
 0.2214E-01 0.7481E-04 0.7492E-02 0.2906E-01 0.1682E-01 0.6001E-01 0.7087E-01
 0.2037E-01 0.1469    
      21       9
 0.2331E-01-0.1479E-03 0.7441E-02 0.2520E-01 0.1537E-01 0.5753E-01 0.7325E-01
 0.2136E-01 0.1439    
      22       9
 0.2377E-01-0.2597E-03 0.7385E-02 0.2614E-01 0.1565E-01 0.6142E-01 0.7073E-01
 0.1946E-01 0.1424    
      23       9
 0.2366E-01-0.1304E-03 0.7536E-02 0.2996E-01 0.1942E-01 0.5751E-01 0.7112E-01
 0.2063E-01 0.1442    
      24       9
 0.2353E-01-0.1806E-03 0.7412E-02 0.3136E-01 0.2238E-01 0.6733E-01 0.7275E-01
 0.1907E-01 0.1425    
      25       9
 0.2278E-01-0.3747E-03 0.7351E-02 0.3003E-01 0.1832E-01 0.6088E-01 0.7126E-01
 0.2140E-01 0.1469    
      26       9
 0.2259E-01-0.3012E-03 0.7219E-02 0.2732E-01 0.1631E-01 0.5692E-01 0.6851E-01
 0.1875E-01 0.1447    
      27       9
 0.2231E-01-0.2277E-03 0.7038E-02 0.2828E-01 0.1892E-01 0.5589E-01 0.6876E-01
 0.1963E-01 0.1413    
      28       9
 0.2229E-01-0.2523E-03 0.6896E-02 0.3183E-01 0.1796E-01 0.5565E-01 0.6928E-01
 0.1921E-01 0.1425    
      29       9
 0.2152E-01-0.3977E-03 0.7060E-02 0.3026E-01 0.1822E-01 0.5779E-01 0.7268E-01
 0.1956E-01 0.1445    
      30       9
 0.2109E-01-0.2360E-03 0.6998E-02 0.3183E-01 0.1643E-01 0.5578E-01 0.7322E-01
 0.2124E-01 0.1492    
      31       9
 0.2135E-01-0.2020E-04 0.6787E-02 0.2956E-01 0.1830E-01 0.5778E-01 0.7114E-01
 0.2004E-01 0.1447    
      32       9
 0.2154E-01 0.1254E-03 0.6829E-02 0.3317E-01 0.2162E-01 0.6202E-01 0.7061E-01
 0.1795E-01 0.1412    
      33       9
 0.2199E-01-0.6386E-04 0.6709E-02 0.2947E-01 0.1854E-01 0.5679E-01 0.7039E-01
 0.1803E-01 0.1458    
      34       9
 0.2184E-01 0.8950E-04 0.6689E-02 0.3075E-01 0.1846E-01 0.5174E-01 0.7162E-01
 0.1975E-01 0.1443    
      35       9
 0.2168E-01 0.4526E-04 0.6550E-02 0.3146E-01 0.1977E-01 0.5322E-01 0.7290E-01
 0.1834E-01 0.1470    
      36       9
 0.2153E-01 0.2621E-03 0.6705E-02 0.2954E-01 0.1959E-01 0.5310E-01 0.7244E-01
 0.1869E-01 0.1441    
      37       9
 0.2234E-01 0.2712E-03 0.6856E-02 0.3043E-01 0.2318E-01 0.6494E-01 0.7143E-01
 0.1889E-01 0.1426    
      38       9
 0.2217E-01 0.2001E-03 0.7079E-02 0.2945E-01 0.2101E-01 0.6468E-01 0.7113E-01
 0.1815E-01 0.1429    
      39       9
 0.2235E-01 0.2269E-03 0.7234E-02 0.2940E-01 0.1930E-01 0.6252E-01 0.7006E-01
 0.2083E-01 0.1450    
      40       9
 0.2280E-01 0.2957E-04 0.7126E-02 0.2971E-01 0.1971E-01 0.5912E-01 0.7027E-01
 0.1819E-01 0.1493    
      41       9
 0.2296E-01 0.1358E-03 0.6955E-02 0.2877E-01 0.1901E-01 0.5768E-01 0.6981E-01
 0.1956E-01 0.1449    
      42       9
 0.2302E-01-0.2015E-03 0.7196E-02 0.3145E-01 0.1959E-01 0.5772E-01 0.7115E-01
 0.2065E-01 0.1445    
      43       9
 0.2277E-01-0.2184E-03 0.6900E-02 0.3119E-01 0.2150E-01 0.5739E-01 0.6990E-01
 0.2023E-01 0.1435    
      44       9
 0.2300E-01-0.1301E-03 0.6936E-02 0.2865E-01 0.1844E-01 0.5872E-01 0.6876E-01
 0.1887E-01 0.1478    

Your help would be highly appreciated! 非常感谢您的帮助!

In base R there is the function read.fwf that reads fixed width files. 在基本R中,有一个read.fwf函数,用于读取固定宽度的文件。 It has the capability to read multi-line file formats, by passing a list to the argument widths . 通过将list传递给参数widths ,它具有读取多行文件格式的功能。

Here is a starting point for your data, (assuming your data file is called "raw"): 这是数据的起点(假设您的数据文件称为“原始”):

dat <- read.fwf(raw, skip=11, 
    widths=list(
        c(8, 8), 
        c(11, rep(11, 6)),
        c(11, 11)
        ),
    stringsAsFactors=FALSE,
    colClasses="character"
)

Convert columns to numeric. 将列转换为数字。 (There seems to be something odd with the column alignment of row 19 of your data. Usually the following step would not be necessary, because numeric conversion happens automatically.) (数据第19行的列对齐方式似乎有些奇怪。通常不需要执行以下步骤,因为数值转换是自动进行的。)

dat <- as.data.frame(lapply(dat, as.numeric))

The results: 结果:

str(dat)

'data.frame':   44 obs. of  11 variables:
 $ V1 : num  1 2 3 4 5 6 7 8 9 10 ...
 $ V2 : num  9 9 9 9 9 9 9 9 9 9 ...
 $ V3 : num  0.0232 0.0232 0.0231 0.0228 0.0226 ...
 $ V4 : num  0.00117 0.00146 0.00136 0.00112 0.00114 ...
 $ V5 : num  0.00902 0.00849 0.00823 0.00798 0.00789 ...
 $ V6 : num  0.0355 0.0354 0.0303 0.0294 0.0294 ...
 $ V7 : num  0.0154 0.0184 0.0159 0.0142 0.0152 ...
 $ V8 : num  0.186 0.094 0.0785 0.0705 0.0639 ...
 $ V9 : num  0.0517 0.0619 0.0683 0.0699 0.0704 ...
 $ V10: num  0.0154 0.0168 0.02 0.0199 0.0191 ...
 $ V11: num  0.23 0.154 0.145 0.141 0.144 ...

The only remaining task is to remove the second column, which is trivial. 剩下的唯一任务是删除第二列,这很简单。

R is not very handy for performing data manipulation. R对于执行数据操作不是很方便。 You should do the manipulation of this kind in another way prior to loading it into R for statistical analysis. 在将其加载到R中进行统计分析之前,应以其他方式进行这种操作。 You could use an ETL-tool (Extraction, Transformation and Loading) for this job. 您可以为该作业使用ETL工具(提取,转换和加载)。 I'm currently only familiar with one ETL tool (Integration Services which comes with SQL Server), but I'm sure others are available. 我目前仅熟悉一种ETL工具(SQL Server附带的集成服务),但是我确定其他工具可用。

Alternatively you can write a script that does the manipulation for you. 或者,您可以编写一个脚本来为您执行操作。

This of cause depends on your technical options and skills... :) 原因取决于您的技术选择和技能... :)

Good luck. 祝好运。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM