如何正确导入 semicolon-separated 文件
How to properly import a semicolon-separated file
我一直在尝试导入以下 semi-colon 分隔文件:
# word len;freq;mean;sens;npos;u;orthon;freqn;bgp WN000000
fiber "5;8.671;1;5;1;0;5;6.1;0;-1" 10000000
clad "4;6.78;2;2;1;1;8;7.84;2026;-1" 10000000
tucker "6;8.103;2;3;2;0.91829583405449;7;5.5;4547;-1" 10000000
我尝试了 read.csv
和 data.table::fread
,但没有成功。 read.csv
识别了部分headers,实际值都在第一列下:
X..word.len freq mean sens npos u orthon freqn bgp.WN000000
1 fiber\t5;8.671;1;5;1;0;5;6.1;0;-1\t10000000 NA NA NA NA NA NA NA NA
2 clad\t4;6.78;2;2;1;1;8;7.84;2026;-1\t10000000 NA NA NA NA NA NA NA NA
3 tucker\t6;8.103;2;3;2;0.91829583405449;7;5.5;4547;-1\t10000000 NA NA NA NA NA NA NA NA
fread
识别第一列,但将所有其他列合并为一个。
X..word len.freq.mean.sens.npos.u.orthon.freqn.bgp WN000000
1 fiber 5;8.671;1;5;1;0;5;6.1;0;-1 10000000
2 clad 4;6.78;2;2;1;1;8;7.84;2026;-1 10000000
3 tucker 6;8.103;2;3;2;0.91829583405449;7;5.5;4547;-1 10000000
有人能帮忙吗?
据我所知,基本上有两个分隔符在那里工作。可能值得手动处理,而不是使用标准的阅读功能。
读入文件,去掉引号,然后用 space 和分号分隔符分隔。
library( magrittr )
input <- readLines( "~/Desktop/Untitled" ) %>%
gsub( '"|^# +', "", . ) %>%
strsplit( "\ +|;" )
将除第一行以外的所有内容转换为数据框。
input[-1] %>%
do.call( what = rbind ) %>%
as.data.frame()
然后使用第一行作为列名。我们需要在此处添加一个额外的内容,因为您的 header 没有足够的名称来覆盖您的数据。
names( df ) <- c( input[[1]][1:10], "fill.col", input[[1]][11] )
结果:
> df
word len freq mean sens npos u orthon freqn bgp fill.col WN000000
1 fiber 5 8.671 1 5 1 0 5 6.1 0 -1 10000000
2 clad 4 6.78 2 2 1 1 8 7.84 2026 -1 10000000
3 tucker 6 8.103 2 3 2 0.91829583405449 7 5.5 4547 -1 10000000
这是我尝试的方法(并根据 David Arenburg 的评论进行了编辑)。
先读取并处理header行;然后跳过第一行阅读剩余的行:
library(data.table)
header <- strsplit(readLines('test.txt', n = 1), '\s+')[[1]][-1]
res <- fread('test.txt', skip = 1, header = FALSE)
setnames(res, 1:3, header)
res[, strsplit(header[2], ';')[[1]] :=
tstrsplit(get(header[2]), ';', type.convert = TRUE, fixed = TRUE)[-10]]
res[, header[2] := NULL]
# word WN000000 len freq mean sens npos u orthon freqn bgp
# 1: fiber 10000000 5 8.671 1 5 1 0.0000000 5 6.10 0
# 2: clad 10000000 4 6.780 2 2 1 1.0000000 8 7.84 2026
# 3: tucker 10000000 6 8.103 2 3 2 0.9182958 7 5.50 4547
需要注意的是,在输入文件的第二列中有 9 项以 ;
分隔,但以下行有 10 项以 ;
分隔。
我一直在尝试导入以下 semi-colon 分隔文件:
# word len;freq;mean;sens;npos;u;orthon;freqn;bgp WN000000
fiber "5;8.671;1;5;1;0;5;6.1;0;-1" 10000000
clad "4;6.78;2;2;1;1;8;7.84;2026;-1" 10000000
tucker "6;8.103;2;3;2;0.91829583405449;7;5.5;4547;-1" 10000000
我尝试了 read.csv
和 data.table::fread
,但没有成功。 read.csv
识别了部分headers,实际值都在第一列下:
X..word.len freq mean sens npos u orthon freqn bgp.WN000000
1 fiber\t5;8.671;1;5;1;0;5;6.1;0;-1\t10000000 NA NA NA NA NA NA NA NA
2 clad\t4;6.78;2;2;1;1;8;7.84;2026;-1\t10000000 NA NA NA NA NA NA NA NA
3 tucker\t6;8.103;2;3;2;0.91829583405449;7;5.5;4547;-1\t10000000 NA NA NA NA NA NA NA NA
fread
识别第一列,但将所有其他列合并为一个。
X..word len.freq.mean.sens.npos.u.orthon.freqn.bgp WN000000
1 fiber 5;8.671;1;5;1;0;5;6.1;0;-1 10000000
2 clad 4;6.78;2;2;1;1;8;7.84;2026;-1 10000000
3 tucker 6;8.103;2;3;2;0.91829583405449;7;5.5;4547;-1 10000000
有人能帮忙吗?
据我所知,基本上有两个分隔符在那里工作。可能值得手动处理,而不是使用标准的阅读功能。
读入文件,去掉引号,然后用 space 和分号分隔符分隔。
library( magrittr )
input <- readLines( "~/Desktop/Untitled" ) %>%
gsub( '"|^# +', "", . ) %>%
strsplit( "\ +|;" )
将除第一行以外的所有内容转换为数据框。
input[-1] %>%
do.call( what = rbind ) %>%
as.data.frame()
然后使用第一行作为列名。我们需要在此处添加一个额外的内容,因为您的 header 没有足够的名称来覆盖您的数据。
names( df ) <- c( input[[1]][1:10], "fill.col", input[[1]][11] )
结果:
> df
word len freq mean sens npos u orthon freqn bgp fill.col WN000000
1 fiber 5 8.671 1 5 1 0 5 6.1 0 -1 10000000
2 clad 4 6.78 2 2 1 1 8 7.84 2026 -1 10000000
3 tucker 6 8.103 2 3 2 0.91829583405449 7 5.5 4547 -1 10000000
这是我尝试的方法(并根据 David Arenburg 的评论进行了编辑)。
先读取并处理header行;然后跳过第一行阅读剩余的行:
library(data.table)
header <- strsplit(readLines('test.txt', n = 1), '\s+')[[1]][-1]
res <- fread('test.txt', skip = 1, header = FALSE)
setnames(res, 1:3, header)
res[, strsplit(header[2], ';')[[1]] :=
tstrsplit(get(header[2]), ';', type.convert = TRUE, fixed = TRUE)[-10]]
res[, header[2] := NULL]
# word WN000000 len freq mean sens npos u orthon freqn bgp
# 1: fiber 10000000 5 8.671 1 5 1 0.0000000 5 6.10 0
# 2: clad 10000000 4 6.780 2 2 1 1.0000000 8 7.84 2026
# 3: tucker 10000000 6 8.103 2 3 2 0.9182958 7 5.50 4547
需要注意的是,在输入文件的第二列中有 9 项以 ;
分隔,但以下行有 10 项以 ;
分隔。