为什么在将 .txt 文件导入 R 时所有变量都压缩到一列中

Why are all variables condensed into one column when importing .txt file into R

我有一个 .txt 文件样本 here。我的数据快照如下:

我想将此 .txt 文件导入 R。第一列包含 13 个字符。对于第一行,第一列应该是“201701001 011”,236、240、236是第2、3、4列......

我试过下面的代码:

data <- read.table("<path>\Sample.txt", sep = "\t")

但是所有变量都被压缩到一个列中。我应该如何将它们分成不同的列?

使用包 readr 中的 read_table:

df<-readr::read_table("https://raw.githubusercontent.com/Patricklv/Importing-.txt-file/master/Sample.txt",col_names=F)

之所以将所有变量压缩为一个是因为输入文件中没有制表符。而是尝试其中之一。

1) read.fwf 此文件具有固定宽度的字段,因此使用 read.fwf 指定字段宽度作为第二个参数。没有使用包。

u <- "https://raw.githubusercontent.com/Patricklv/Importing-.txt-file/master/Sample.txt"
widths <- c(13, rep(8, 9))
read.fwf(u, widths)

给予:

              V1  V2  V3  V4  V5  V6  V7  V8  V9 V10
1  201701001 011 236 240 236 226 224 238 239 240 232
2  201701001 111 299 285 237 252 227 249 237 233 238
3  201701001 211 287 292 296 230 237 234 235 254 251
4  201701001 311 286 287 311 283 237 240 226 240 246
5  201701001 411 270 273 282 318 277 243 248 236 243
6  201701001 511 279 276 284 280 305 285 262 249 241
7  201701001 611 288 284 286 281 272 299 284 257 238
8  201701001 711 293 290 292 284 269 278 298 282 257
9  201701001 811 314 305 290 298 267 265 282 292 277
10 201701001 911 314 310 310 295 288 270 261 292 292
11 2017010011011 308 311 321 309 281 277 270 250 301
12 2017010011111 325 319 312 332 303 287 294 275 254

像我们上面所做的那样手动计算字段似乎很容易,但它可以通过定位字段结束 ends 从第一行数据 L1 自动完成出现在一个数字后跟两个或多个 spaces (\d +) 或 (|) 后跟一个数字后跟行尾 (\d$)。至少有两个 space 很重要,因为单个 space 可以出现在第一个字段中。最后,字段宽度 widthsends 的第一个组成部分,后面是 ends.

中连续位置的差异
L1 <- readLines(u, 1)
ends <- gregexpr("\d  |\d$", L1)[[1]]
widths <- c(ends[1], diff(ends))

2) 这是一个备选方案。由于单个 space 可以出现在第一个字段中,并且所有真正的分隔符至少由 2 个 space 组成,我们可以在文件中读取,替换所有出现的 2 个或更多的 运行 spaces 带逗号,然后使用逗号分隔符阅读。 u 来自上方。这有点长,但仍然只有一行,并且无需计算字段宽度。没有使用包。

read.table(text = gsub("  +", ",", readLines(u)), sep = ",")

3) 另一种选择可以基于这样一个事实,即我们已经从问题中知道第一个字段是 13 个字符,其余字段由 spaces 所以选择第一个字段 cbind 到其余 re-reading 其余使用 read.table。同样,没有使用包。

L <- readLines(u)
cbind(V0 = substring(L, 1, 13), read.table(text = substring(L, 14)))