4

道歉,因为我认为会有一个非常明显的答案,但我在网上找不到任何东西......

我经常得到非常大的数据集,其中缺失值是空白的,例如(简而言之)

#Some description of the dataset
#cover x number of lines
31   3213 313   64    63
31   3213 313   64    63
31   3213 313   64    63
31   3213 313   64    63
31   3213 313   64    63
12   178        190   865
532  31   6164  68
614       131   864   808

例如,我想将所有空白替换为 -999。如果我使用这样的读取表

dat = read.table('file.txt',skip=2)

我收到错误消息

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
line 6 did not have 5 elements

我可以将文件作为数据框打开并执行

dat = data.frame('file.txt',skip=2)
is.na(rad1) = which(rad1 == '')

但我不知道它是否会起作用,因为我不知道在读取数据帧时如何跳过前两行(例如,相当于“跳过”),而且我在任何地方都找不到答案。有人可以帮忙吗?

谢谢。

4

1 回答 1

14

如果您知道每列的宽度,那么您可以使用read.fwf

例如

> dat <- read.fwf('temp.txt', skip=2, widths=c(5,5,6,6,6))
> dat
   V1   V2   V3  V4  V5
1  31 3213  313  64  63
2  31 3213  313  64  63
3  31 3213  313  64  63
4  31 3213  313  64  63
5  31 3213  313  64  63
6  12  178   NA 190 865
7 532   31 6164  68  NA
8 614   NA  131 864 808

虽然用你想要的任何值替换值很容易NA,但这只是个坏主意,因为 R 有很多处理 NA 值的好方法。

例如,要取第二列的平均值,请使用:

mean(dat$V2, na.rm=TRUE)
[1] 163.4286

R 具有处理缺失数据的其他功能。例如,您可以使用na.omit()完全删除缺少数据的行。

> na.omit(dat)
  V1   V2  V3 V4 V5
1 31 3213 313 64 63
2 31 3213 313 64 63
3 31 3213 313 64 63
4 31 3213 313 64 63
5 31 3213 313 64 63
于 2013-01-24T09:45:40.770 回答