【问题标题】:convert character to data frame or matrix with fixed number of columns将字符转换为具有固定列数的数据框或矩阵
【发布时间】:2015-07-22 03:42:50
【问题描述】:

我正在尝试从网站中提取值。提取的值如下所示。

"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)))

【问题讨论】:

  • 有什么理由不能尝试使用read.table()
  • 你为什么要gsubbing 占用空间?似乎在\\s+strsplit 可能更有意义
  • 我将在后面的步骤中拆分它。我想用单个空格替换所有空格,然后根据单个空格拆分值
  • 我使用 readlines 从网页中提取值并获取我想要的部分。所以我将无法使用读取表

标签: r matrix dataframe


【解决方案1】:

更新,原来的问题已经改变了。

看起来您的数据是固定宽度格式。您可以使用?read.fwf,尽管它的使用在某种程度上取决于您的数据源的可靠性。如果您从中获取数据的地方有关于如何始终格式化数据的规范(例如“11 列,每列 10 个字符”),那将很有帮助。

# 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))

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


您可以只使用索引将 NA 放在空白处,例如(1:9)[1:11] 将选择前 9 个元素(即 1:9),然后在末尾放置两个 NA 以将其填充为 11 个元素。

# assuming df is such that df[1] is the first line, df[2] is the second etc
tmp <- strsplit(df, '\\s+')
ncols <- max(sapply(tmp, length)) # could do max(lengths(tmp)) if you have a new
                                  # enough R. Or if you already know there are
                                  # at most 9 columns just set it to 9 directly
cc <- do.call('rbind', lapply(tmp, '[', i=seq_len(ncols)))
cc <- data.frame(cc)

【讨论】:

  • 试过了,它似乎不符合我的要求。谢谢你的帮助。如果第一行在值之间有一些空格,则移动到前一列
  • 在某些情况下,我还需要将 NA 放在中间的列中。
  • 嗯,你原来的问题和可重现的例子没有反映这一点,所以我无法读懂它。我会看看你更新的问题。
  • 列之间的分隔符 - 是制表符还是空格?列之间是否总是至少有 4 个空格?
  • ftp.cmegroup.com/pub/settle/stlags 它们只是空格。我正在尝试从该网站获取值。
【解决方案2】:

您可以尝试使用列中的恒定距离,每列包含字符 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
    }    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-11
    • 2017-02-06
    • 2021-11-12
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多