r - 将列表中的元素 x 到 y 粘贴在一起

标签 r data.table

我正在使用 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/

相关文章:

r - 如何在 R 编程中为多个页面创建标题和脚注? RTF 或 PDF 格式

r - 消除数据表中选定的行

r - 根据条件合并/加入数据框/表 -> 或 <

r - 如何根据 df1 中的开始日期和结束日期使用 df2 中变量的总和在 df1 中创建新变量?

r - 作为另一个函数(摘要)的新数据框列对我不起作用

r - qplot可以不用中间列直接显示百分比吗?

r - 合并较大数据的有效替代方法

r - 从 R 传单 map 中的绘图对象获取坐标

r - 是否可以跟踪包装 reshape 中熔化等功能的进度?

r - 表格中的背景减法