R cSplit仅使用字符串中的第一个分隔符

时间:2016-05-18 15:41:22

标签: r concatenation delimiter splitstackshape

我有一个包含两列的长列表,其中我在多行中的每列中都有相同的字符串。因此,我使用paste使用-进行连接,然后使用setDT以及其频率返回唯一的concats集。

现在我想扭转我的连接。

我试过了:

library(splitstackshape)
d5 <- cSplit(d4, 'conc', '-', 'wide')

然而,在我的第二栏中,我有时在字符串中有多个-

为了解决这个问题,我希望cSplit只使用第一个-分隔符。

示例:

 conc      freq
 A-hello      4
 A-Hi-there   5
 B-HELLO      1

使用上面的cSplit将返回:

freq conc_001  conc_002  conc_003
   4        A     hello        NA
   5        A        Hi     there
   1        B     HELLO        NA

我想:

freq conc_001  conc_002
   4        A     hello
   5        A  Hi-there
   1        B     HELLO

2 个答案:

答案 0 :(得分:3)

这是另一个想法。通过使用sub,我们将其限制为仅更改字符串的第一个指定范围。然后,我们将cSplit与新的分隔符一起使用。

library(splitstackshape)
df$conc <- sub('-', ' ', df$conc)
cSplit(df, 'conc', ' ', 'wide')
#   freq conc_1   conc_2
#1:    4      A    hello
#2:    5      A Hi-there
#3:    1      B    HELLO

答案 1 :(得分:2)

试试这个,也许不像使用csplit函数那样直截了当。使用此方法,性能相当快。

#Sample Data    
s<-c("A-hello", "A-Hi-there", "B-HELLO")
df<-data.frame(s)

#split the data into 2 parts and assign to new columns in the dataframe.
library(stringr)
mat  <- matrix(unlist(str_split(df$s, "-", n=2)), ncol=2, byrow=TRUE)
dfnew<-as.data.frame(mat, stringsAsFactors = FALSE)

创建矩阵“mat”后,可以将结果压缩到原始矩阵上。