gpt4 book ai didi

r - 在 data.table 列中分割文本字符串

转载 作者:行者123 更新时间:2023-12-03 05:20:33 25 4
gpt4 key购买 nike

我有一个脚本,可以将 CSV 文件中的数据读入 data.table,然后将一列中的文本拆分为几个新列。我目前正在使用 lapplystrsplit 函数来执行此操作。这是一个例子:

library("data.table")
df = data.table(PREFIX = c("A_B","A_C","A_D","B_A","B_C","B_D"),
VALUE = 1:6)
dt = as.data.table(df)

# split PREFIX into new columns
dt$PX = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 1))
dt$PY = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 2))

dt
# PREFIX VALUE PX PY
# 1: A_B 1 A B
# 2: A_C 2 A C
# 3: A_D 3 A D
# 4: B_A 4 B A
# 5: B_C 5 B C
# 6: B_D 6 B D

在上面的示例中,PREFIX 列在“_”字符上拆分为两个新列 PXPY

尽管这工作得很好,但我想知道是否有更好(更有效)的方法来使用data.table来做到这一点。我的真实数据集有 >=10M+ 行,因此时间/内存效率变得非常重要。

<小时/>

更新:

按照@Frank的建议,我创建了一个更大的测试用例并使用了建议的命令,但是stringr::str_split_fixed比原始方法花费了更长的时间。

library("data.table")
library("stringr")
system.time ({
df = data.table(PREFIX = rep(c("A_B","A_C","A_D","B_A","B_C","B_D"), 1000000),
VALUE = rep(1:6, 1000000))
dt = data.table(df)
})
# user system elapsed
# 0.682 0.075 0.758

system.time({ dt[, c("PX","PY") := data.table(str_split_fixed(PREFIX,"_",2))] })
# user system elapsed
# 738.283 3.103 741.674

rm(dt)
system.time ( {
df = data.table(PREFIX = rep(c("A_B","A_C","A_D","B_A","B_C","B_D"), 1000000),
VALUE = rep(1:6, 1000000) )
dt = as.data.table(df)
})
# user system elapsed
# 0.123 0.000 0.123

# split PREFIX into new columns
system.time ({
dt$PX = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 1))
dt$PY = as.character(lapply(strsplit(as.character(dt$PREFIX), split="_"), "[", 2))
})
# user system elapsed
# 33.185 0.000 33.191

因此 str_split_fixed 方法大约需要 20 倍的时间。

最佳答案

更新:从版本 1.9.6(截至 2015 年 9 月在 CRAN 上)开始,我们可以使用函数 tstrsplit() 直接获取结果(并且在一种更有效的方式):

require(data.table) ## v1.9.6+
dt[, c("PX", "PY") := tstrsplit(PREFIX, "_", fixed=TRUE)]
# PREFIX VALUE PX PY
# 1: A_B 1 A B
# 2: A_C 2 A C
# 3: A_D 3 A D
# 4: B_A 4 B A
# 5: B_C 5 B C
# 6: B_D 6 B D

tstrsplit() 基本上是 transpose(strsplit()) 的包装器,其中 transpose() 函数(也是最近实现的)进行转置一个列表。请参阅 ?tstrsplit()?transpose() 示例。

查看历史记录以获取旧答案。

关于r - 在 data.table 列中分割文本字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18154556/

25 4 0