首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在data.table列中拆分文本字符串

在data.table列中拆分文本字符串
EN

Stack Overflow用户
提问于 2013-08-10 03:49:43
回答 3查看 61.4K关注 0票数 91

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

代码语言:javascript
复制
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花费的时间比原始方法长得多。

代码语言:javascript
复制
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倍。

EN

回答 3

Stack Overflow用户

发布于 2016-05-17 04:07:09

使用splitstackshape包:

代码语言:javascript
复制
library(splitstackshape)
cSplit(df, splitCols = "PREFIX", sep = "_", direction = "wide", drop = FALSE)
#    PREFIX VALUE PREFIX_1 PREFIX_2
# 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
票数 7
EN

Stack Overflow用户

发布于 2018-10-05 00:40:20

我们可以尝试:

代码语言:javascript
复制
library(data.table)  
cbind(dt, fread(text = dt$PREFIX, sep = "_", header = FALSE))
    #    PREFIX VALUE V1 V2
    # 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
票数 6
EN

Stack Overflow用户

发布于 2017-07-30 21:12:33

对于tidyr,解决方案是:

代码语言:javascript
复制
separate(df,col = "PREFIX",into = c("PX", "PY"), sep = "_")
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18154556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档