4

我有一个包含两列的长列表,其中我在多行中的每一列中都有相同的字符串。所以我过去常常使用paste连接-,然后用setDT它们的频率返回唯一的连接集。

现在我想反转我的串联。

我试过了:

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
4

2 回答 2

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
于 2016-05-18T16:34:50.533 回答
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”,就可以将结果 cbind 到您的原始矩阵上。

于 2016-05-18T16:03:17.130 回答