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

时间:2019-06-03 01:41:00

标签: r readr

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

enter image description here

我想将此.txt文件导入R。第一列包含13个字符。对于第一行,第一列应为“ 201701001 011”,第二,第三和第四列分别为236、240、236……

我尝试了以下代码:

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

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

2 个答案:

答案 0 :(得分:3)

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

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

像上面所做的那样,手工计算字段似乎很容易,但是可以通过定位字段L1的第一行数据ends来自动完成,该字段位于{一个数字,后跟两个或多个空格(\\d +或(|),后跟一个数字,再加上行尾(\\d$)。重要的是至少要有两个空格,因为一个空格可以出现在第一个字段中。最后,字段宽度widthsends的第一部分,其后是ends中连续位置的差异。

L1 <- readLines(u, 1)
ends <- gregexpr("\\d  |\\d$", L1)[[1]]
widths <- c(ends[1], diff(ends))

2)。由于一个空格可以出现在第一个字段中,并且所有真实的分隔符都包含至少2个空格,我们可以在文件中读取这些空格,因此请用逗号替换所有2个或更多空格的情况,然后再使用逗号分隔符进行读取。 u来自上方。这有点长,但仍然只有一行,因此无需计算字段宽度。不使用任何软件包。

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

3)另一种选择可以基于以下事实:我们已经从问题中知道,第一个字段为13个字符,其余字段之间用空格很好地隔开,因此请选择第一个字段并cbind其余部分将使用read.table重新读取其余部分。同样,不使用任何软件包。

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

答案 1 :(得分:1)

使用包读取器中的read_table:

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