【问题标题】:Why are all variables condensed into one column when importing .txt file into R为什么将.txt文件导入R时所有变量都压缩为一列
【发布时间】:2019-06-03 01:41:00
【问题描述】:

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

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

我尝试了下面的代码:

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

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

【问题讨论】:

标签: r readr


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    使用 readr 包中的 read_table:

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

    【讨论】:

    • 感谢您的回答,它实际上比 read.fwf 工作得快得多。但是,当我使用sum(df$X9) 计算列总和时,结果数为 175188935。当我对使用 read.fwf 导入的数据执行相同操作时,我得到 323405935,这是真正的列总和。我想知道为什么会有差异。
    • read_table 与您提供的示例配合得很好,但它可能与read_fwf 一样安全,因为它意味着基于空格的列拆分。
    猜你喜欢
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2014-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 2022-07-06
    相关资源
    最近更新 更多