用空单元格读取文本为NA

时间:2013-10-15 21:20:35

标签: r read.table

让我们给一个包含字符串的向量,就像这样:

> string
[1] "   26     10.00       28.00      28.00      28.00     28.00      28.00    28.00      26"
[2] "   27     10.00       28.00      28.00      28.00     28.00      28.00    28.00      27"
[3] "   28     10.00       28.00      28.00      28.00     28.00      28.00    28.00      28"
[4] "   29     10.00                  28.00      28.00     28.00      28.00    28.00      29"
[5] "   30     10.00                  28.00      28.00     28.00      28.00    28.00      30"
[6] "   31     10.00                  28.00                28.00               28.00      31"

我希望将其作为data.frame读取,包含6行和9列,如下所示:

  V1 V2 V3 V4 V5 V6 V7 V8 V9
1 26 10 28 28 28 28 28 28 26
2 27 10 28 28 28 28 28 28 27
3 28 10 28 28 28 28 28 28 28
4 29 10 NA 28 28 28 28 28 29
5 30 10 NA 28 28 28 28 28 30
6 31 10 NA 28 NA 28 NA 28 31

其中每个空单元格被视为NA。我已尝试使用read.table并设置fill=TRUE,但由于结果如此,它无法正常工作:

> read.table(textConnection(string), sep="", fill=TRUE)
     V1 V2 V3 V4 V5 V6 V7 V8 V9
    1 26 10 28 28 28 28 28 28 26
    2 27 10 28 28 28 28 28 28 27
    3 28 10 28 28 28 28 28 28 28
    4 29 10 28 28 28 28 28 29 NA
    5 30 10 28 28 28 28 28 30 NA
    6 31 10 28 28 28 31 NA NA NA

我坚持这个。也许这比我想象的要容易,但我无法弄清楚如何做到这一点:(

这是数据:

string <- c("   26     10.00       28.00      28.00      28.00     28.00      28.00    28.00      26",
                "   27     10.00       28.00      28.00      28.00     28.00      28.00    28.00      27", 
                "   28     10.00       28.00      28.00      28.00     28.00      28.00    28.00      28", 
                "   29     10.00                  28.00      28.00     28.00      28.00    28.00      29", 
                "   30     10.00                  28.00      28.00     28.00      28.00    28.00      30", 
                "   31     10.00                  28.00                28.00               28.00      31")

1 个答案:

答案 0 :(得分:4)

看起来您可以使用read.fwf()

ff <- tempfile()
cat(file = ff, "12 34 56", "98    54", sep = "\n")
read.fwf(ff, widths=c(3,3,2))
#   V1 V2 V3
# 1 12 34 56
# 2 98 NA 54