我正在使用 data.table 中的 fread()
读取大量数据集。问题在于每行的字段数量 (separator = ;
) 各不相同。我主要对前 5 列感兴趣,但也想查看第 6 列到第 n 列的内容。
示例数据
我使用 data.table::fread()
和 sep = ""
读取数据,以整行读取。
DT <- data.table::fread("1;2;3;4;5;6
1;2;3;4;5;6;7;8
1;2;3;4;5", sep = "", header = FALSE, col.names = "text" )
# text
#1: 1;2;3;4;5;6
#2: 1;2;3;4;5;6;7;8
#3: 1;2;3;4;5
到目前为止的代码
前五列出现在所有行中,我可以使用 tstrsplit() 轻松取出它们:
DT[, c("v1", "v2", "v3", "v4", "v5") := tstrsplit( text , ";")[1:5] ][]
# text v1 v2 v3 v4 v5
# 1: 1;2;3;4;5;6 1 2 3 4 5
# 2: 1;2;3;4;5;6;7;8 1 2 3 4 5
# 3: 1;2;3;4;5 1 2 3 4 5
我的问题
我想将第五个分号之后的所有字段(或第五个分号之后的所有字段)放入名为 v6
的列中,以便结果如下所示:
desired_output <- DT[, v6 := c( "6", "6;7;8", NA_character_) ]
# text v1 v2 v3 v4 v5 v6
# 1: 1;2;3;4;5;6 1 2 3 4 5 6
# 2: 1;2;3;4;5;6;7;8 1 2 3 4 5 6;7;8
# 3: 1;2;3;4;5 1 2 3 4 5 <NA>
注意: ; 之间的文本长度;可能会有所不同,因此并不总是一,也不总是数字。
我的生产数据超过 100 万行,因此解决方案越快越好。
最佳答案
问题是第 201 行有 9 列,但此时 fread
已确定最多有 8 列。您可以使用以下命令破解它以读取所有 9 列:
x <- fread("test.txt",fill=TRUE, sep="\t", colClasses=rep("logical",9))
如果 9 还不够,请增加该数字,直到不再看到该错误。这实际上不应该将任何列强制为逻辑列(当指定 colClasses
参数时,data.table::fread
拒绝以导致信息丢失的方式强制列类)。我不确定这种方法会导致什么样的惩罚,但我认为它比其他方法更快(至少在建立最大列数后更快)。
如果您仍然想要将第 6 列以上的列粘贴到单个列中,有很多方法可以实现。
对于后代,请参阅问题评论中列出的链接 ( https://github.com/Rdatatable/data.table/issues/2727 ) 以查看此问题是否已解决。
关于r - 将列表中的元素 x 到 y 粘贴在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55403373/