拆分列的两个条件

时间:2018-02-12 07:32:05

标签: r regex

我有一个这样的数据框:

我想根据"?"将第二列拆分成多列。然而这并不容易,因为刺中还有其他问号。因此,每个子字符串都包含' http'是唯一的共同点。

如何分割它们?输出示例中的列数只是一个示例,我不确切知道可以生成多少列。

输入数据示例:

 df_in <- data.frame(x = c('x1','x2','x3','x4'),
                     y = c('http://example1.com?https://example2.com', 'NA', 'http://example3.com?id=1234?https://example4/com?http://example6.com', 'http://example5.com'))

在控制台中打印的数据框:

 df_in
  x                                                                    y
 x1                             http://example1.com?https://example2.com
 x2                                                                   NA
 x3 http://example3.com?id=1234?https://example4/com?http://example6.com
 x4                                                  http://example5.com

预期产出的例子:

df_out <- data.frame(x = c('x1','x2','x3','x4'),
                     col1 = c('http://example1.com', 'NA', 'http://example3.com?id=1234', 'http://example5.com'),
                     col2 = c('https://example2.com', 'NA', 'https://example4/com', 'NA'),
                     col3 = c('NA', 'NA', 'https://example6/com', 'NA'))

控制台中打印的输出:

 x                        col1                 col2                 col3
 x1         http://example1.com https://example2.com                   NA
 x2                          NA                   NA                   NA
 x3 http://example3.com?id=1234 https://example4/com https://example6/com
 x4         http://example5.com                   NA                   NA

2 个答案:

答案 0 :(得分:5)

我们可以使用中的separate来分隔列&#39; y&#39;通过在tidyr

之前的?处分隔成多列
http

答案 1 :(得分:4)

如果要分割任意数量的域,因此不知道要生成的列数,可以使用cSplit包中的splitstackshape函数。但是,在此之前,我们需要在?http之前添加一个分隔符,即

library(splitstackshape)

df_in$y <-  gsub('(\\w)(\\?h)', '\\1_\\2', df_in$y)
cSplit(df_in 'y', '_?')

#Or all in one line,
cSplit(transform(df_in, y = gsub('(\\w)(\\?h)', '\\1_\\2', y)), 'y', '_?')

给出,

   x                         y_1                   y_2                  y_3
1: x1         http://example1.com  https://example2.com                   NA
2: x2                          NA                    NA                   NA
3: x3 http://example3.com?id=1234  https://example4/com  http://example6.com
4: x4         http://example5.com                    NA                   NA