读取每个响应者多个响应的ASCII文件

时间:2017-01-05 20:20:04

标签: r

我正在尝试将Roper Center中的一些数据读入R中,以便对其进行一些分析。旧数据有时只以ASCII格式出现,它只是数字的数据文件,有时没有空格或分隔符。每个人也有几排。这是一个例子

0001   01 06722121     101632          3113581R50106                050110M323
0001   0202089917300208991744  100154109020B73013.22        1O                
0001   039049MON FEB  8 1999 05:30pm   1 8   0208991830 6:30PM         05071  
0001   04                5                                       51           
0001   052206  32     1    21                     111                         
0001   06        1122223413323                      1122160921080711122112  11
0001   0722221205111223241121212220612111111122 21 2222                     
0002   01 09318035     001582          2123551R00106                0501I333
0002   0202089917320208991746   50074616080B42014.20        1O              
0002   039039MON FEB  8 1999 05:31pm   1 8   0208991831 6:31PM         05041  
0002   04                2                                       61         
0002   05 206  32     3    11                     121                         
0002   06        1245545554555                      1152080614031221121131  11
0002   0752321202112112322112434410722131242122 21 122222

我在那里更改了一些数字,希望我没有弄乱它,但我认为你需要订阅Roper中心来获取这些数据。

我需要为每个受访者提取几个元素并将它们放入列中。我会多次这样做,所以只适用于这种情况的代码是不切实际的。

到目前为止,我一直在使用R中的包读取器,但现在每个人有很多行,它变得越来越复杂,我想知道是否有人知道使用R包或简单功能来快速处理这个问题。

一个很好的例子就是获得此样本中的所有权重。这些发生在第13-15列中,并且在每个人的第一行中找到。

1 个答案:

答案 0 :(得分:-1)

酷解决方案:你的文件带有固定宽度的字典,对吧?在这种情况下,请使用readr::read_fwf

丑陋的解决方案如下。如果您有大量数据,可能会窒息,并且可能(不会,将会)将某些变量分开。

x指定您的ASCII文件。

library(dplyr)
library(readr)

x <- read_lines(x)
x <- data_frame(
  uid = str_sub(x, 1, 4), # careful here, assuming UIDs are 4-length
  txt = str_sub(x, 8)     # careful here too
)

x <- lapply(unique(x$uid), function(y) {
  paste0(x$txt[ x$uid == y], collapse = " ") %>%
    strsplit("\\s+") %>%
    unlist %>%
    matrix(ncol = length(.)) %>%
    as_data_frame
}) %>%
  bind_rows %>%
  write_csv("whatever.csv")

您现在可以使用整齐的变量名称重新导入数据并设置正确的列类型:

x <- read_csv(x, col_names = c(
  # column names
),
col_types = "cccciiii -- etc.")