在数据表中按最后一个空格分割字符串

3
我有一个数据表格,包含2列:
             term  freq
1:    a arena tour    1
2: a available why    1
3:     a backup in    1
4:       a bad ass    1
5:     a bad chick    1

我希望将“term”列按最后一个空格拆分,例如:
         termA  termB freq
1:     a arena   tour    1
2: a available    why    1
3:    a backup     in    1
4:       a bad  chick    1

我尝试使用以下代码中的 "str",它适用于单个字符串,但不适用于 data.date(它似乎在所有行上使用相同的索引)

data.table (termA = substr(dt_n3$term, 1, rev(gregexpr("\\ ", dt_n3$term)[[1]])[1]-1),
                         termB = substr(dt_n3$term, rev(gregexpr("\\ ", dt_n3$term)[[1]])[1], 1000),
                         freq = dt_n3$freq)

无论如何,我认为这不是最好的方法。 有人能帮帮我吗? 谢谢

3个回答

7
你可以尝试使用data.table v 1.9.5中的tstrsplit函数。
DT[, paste0('term', LETTERS[1:2]) := tstrsplit(term, ' (?=[^ ]*$)',
                                     perl=TRUE)][, term:=NULL][]
#   freq       termA termB
#1:    1     a arena  tour
#2:    1 a available   why
#3:    1    a backup    in
#4:    1       a bad   ass
#5:    1       a bad chick

数据

DT <- data.table(term= c("a arena tour", "a available why", 
      "a backup in", "a bad ass", "a bad chick"), freq=1)

稍作修改后,您可以在同一语句中执行赋值和删除操作:

cols = c("term", paste0("term", LETTERS[1:2]))
DT[, (cols) := c(list(NULL), tstrsplit(term, ' (?=[^ ]*$)', perl=TRUE))]

NULL分配给term会删除该列。


akrun,谢谢,没什么特别的 - 连接到结果列表中...必须传递NULL作为term - Arun

2
使用sub函数可以分两步完成。
dt = data.table(term = c("a arena tour","a available why","a bad ass"), freq=1)

# erase last part
dt[, termA := sub(" [^ ]*$", "", term)]

# erase first part
dt[, termB := sub(".* ", "", term)]

0
使用 stringi 包:
x <- c("ala ma kota", "this is text")
stri_locate_last_fixed(x, " ")
##      start end
## [1,]     7   7
## [2,]     8   8
splitHere <- stri_locate_last_fixed(x, " ")
stri_sub(x, to= splitHere[,1]-1)
## [1] "ala ma"  "this is"
stri_sub(x, from= splitHere[,1]+1)
## [1] "kota" "text"
cbind(stri_sub(x, to= splitHere[,1]-1), stri_sub(x, from=splitHere[,1]+1))
##      [,1]      [,2]  
## [1,] "ala ma"  "kota"
## [2,] "this is" "text"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接