我正在尝试将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列中,并且在每个人的第一行中找到。
答案 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.")