2017-07-07 144 views
0

我有一个字符串向量,我想从中提取信息。该字符串看起来像以下:从冒号和分号分隔的字符串中提取R

obs, product 
    1, apple:pink lady;grade 1 
    2, apple--pink lady 
    3, orange 

我想提取信息和这样的组织:

obs, product_1, product_2, product_3 
    1, apple, pink lady, grade 1 
    2, apple, pink lady, NA, 
    3, orange, NA, NA 

我是新来编程,并试图用子(“; * $”,” ',datasetname),它将返回一个新的向量,对于obs 1,我可以得到产品1 & 2合并因此,我需要再做一轮来分离新形成的字符串。但是,对于obs 3(没有任何特殊字符,冒号或分号),该函数将返回整个事物。此外,我还需要考虑一些分隔符可能不同的情况,如“ - ”,而不是冒号和分号。

我想知道如何使用sqldf或R中的其他软件包得到我想要的结果?

回答

2

我们可以使用base R做到这一点

df2 <- cbind(df1[1], read.csv(text=gsub('[:;-]+', ',', df1$product), 
     header = FALSE, na.strings = "", col.names = paste0("product_", 1:3))) 

df2 
# obs product_1 product_2 product_3 
#1 1  apple pink lady grade 1 
#2 2  apple pink lady  <NA> 
#3 3 orange  <NA>  <NA> 
+1

可以让'col.names'参数动态与'col.names = paste0( “product_”,1:MAX(sapply(strsplit(DF1 $ product,“[:; - ] +”),length)))' – Benjamin

+0

你能解释一下这些吗?我是新来的。谢谢你的时间。 – Jin

+0

@Zuo我用'gsub'将所有分隔符替换为''',并用'read.csv'读取'product'列来创建三列,然后用第一列'cbind' – akrun