将字符转换为具有固定列数的数据框或矩阵

时间:2015-07-22 03:42:50

标签: r matrix dataframe

我正在尝试从网站中提取值。提取的值看起来像这样。

"3000       ----      ----      ----      ----        '1    UNCH                     '1"                        
"4600       ----      ----      ----      ----        '1    UNCH                     '1"                        
"4800       ----      ----      ----      ----        '1    UNCH                     '1"                        
"5000       ----      ----      ----      ----        '1    UNCH                     '1                     300"
"5200       ----      ----      ----      ----        '1    UNCH                     '1"                        
"5400       ----      ----      ----      ----        '1    UNCH                     '1"                        
"5600       ----      ----      ----      ----        '1    UNCH                     '1                      10"
"5800       ----      ----      ----      ----        '1    UNCH                     '1                       1"
"6000       ----      ----      ----      ----        '1    UNCH                     '1                    5461"
"6200       ----      ----      ----      ----        '1    UNCH                     '1                      54"
"6400       ----      ----      ----      ----        '1    UNCH                     '1                    2009"
"6600       ----      ----      ----      ----        '1    UNCH                     '1                     124"
"6800       ----      ----      ----      ----        '1    UNCH                     '1                     410"
"7000       ----      ----      ----      ----        '1     -'1                     '2                   10704"
"7200       ----      ----        '2A     ----        '2     -'1                     '3                    9927"
"7400       ----      ----      ----      ----        '3    UNCH                     '3                    7869"
"7600       ----      ----      ----      ----        '4    UNCH                     '4          30       13596"
"7800       ----      ----      ----      ----        '5     -'1                     '6         109       16030"
"8000         '7        '7        '7        '7        '7     -'1         467        1'0         731       26912"
"8200        1'4       1'4       1'3      ----       1'2     -'2         119        1'4         222       11030"
"8400        2'2       2'2       2'0       2'0       1'7     -'4         426        2'3         172       15743"
"8600        3'1       3'3       2'7       3'0A      3'0     -'4          66        3'4         330       18964"

有些行的列值较少。我想创建一个11列的数据框,空白的值应保持为空。当我尝试根据空间分割值时,具有较少列值的行会重叠并重复。请找到我尝试过的代码。

  cc=gsub("\\s+"," ",df)
  cc=data.frame(cc)
  cc = data.frame(do.call('rbind', strsplit(as.character(cc),' ',fixed=TRUE)))

2 个答案:

答案 0 :(得分:3)

更新,原始问题已更改。

您的数据看起来像是固定宽度格式。您可以使用this.reportViewer1.LocalReport.ReportPath = "yourReportFileName.rdlc"; ,但它的使用在某种程度上取决于您的数据源的可靠性。如果您从中获取数据的地方有关于如何始终格式化数据的规范(例如“11列,每行10个字符”),那将会有所帮助。

?read.fwf

我选择的宽度适合您提供的数据;你必须根据自己的期望为自己确定合理的价值观。

您可以使用索引将NAs放入空白点,例如# pad out each line to the same length maxlen <- max(sapply(df, nchar)) # it's 110 for your data, it seems df <- sprintf(paste0("%-", maxlen, "s"), df) read.fwf(textConnection(df), widths=c(4, 11, 10, 10, 11, 9, 8, 12, 11, 12, 12)) 将选择前9个元素((1:9)[1:11]),然后在末尾添加两个1:9,将其填充为11个元素。

NA

答案 1 :(得分:0)

您可以尝试使用列中的恒定距离,每列覆盖字符start:end。如果末尾缺少列,则NA将填充到列中。 变量“line”包含提取文件的一行。

start <- c(1,6,17, 27,37,47,57,65,77,88,100)
end   <- c(5,16,26,36,46,56,64,76,87,99,110)

columns <- list()    
for(j in 1:length(start)){
    if(start[j] <= nchar(line)){
        columns[[j]] <- substr(line, start[j],end[j])
    }
    else{
        y[[j]] <- NA
    }    
}