2017-10-23 7 views
0

私は、2つの列、最初の列にはId変数、2番目の列には文字列を含むデータテーブルがあります。 2列目の文字列は、Stringrを使用したデータのクリーニング

"A:randomString|B:randomString|C:randomString"の形式です。

Id、A、B、およびCの4つの列を持つようにテーブルを変更したいとします。Idは同じままで、Aはそれぞれの後にランダムな文字列を持ち、Bは各Bの後に続く文字列を持ちます。 CはC:の後の文字列を持ちます。

stringrを使用してこれを行うことはできますか?

+2

をtidyr( 'ライブラリを試してみてください); df1%>%mutate(col2 = gsub( ".:"、 "col2))%>%separate(col2、into = c( 'A'、 'B'、 'C​​')) ' – akrun

+0

多くの助けになりました!私が今使っている問題は、 "C:randomString"の場合、ランダムな文字列にはアンダースコアが含まれているためです(実際には "C:random_String"に似ています)ので、この文字列が別の列に分割されます。 – newToCoding13

答えて

0

あなたはlookbehind and lookaheadを利用し、この使用stringr::str_extract()と正規表現を行うことができます。

library(tidyverse) 

df <- readr::read_csv("~/../Downloads/test1.csv") 

df <- df %>% 
    mutate(A = str_extract(col2, "(?<=A:).*?(?=\\|)"), 
     B = str_extract(col2, "(?<=B:).*?(?=\\|)"), 
     C = str_extract(col2, "(?<=C:).*?$") 
) 

サンプルデータdfは次のとおりです。

> df 
# A tibble: 2 x 2 
    Id         col2 
    <int>         <chr> 
1  1 A:frog's legs|B:popcorn|C:white_wine! 
2  2  A:banana SUNDAE|B:[email protected]$%^|C:123456 

使用dplyr::mutate()新しい列Aを作成するには、 BおよびC:

> df <- df %>% 
+ mutate(A = str_extract(col2, "(?<=A\\:).*?(?=\\|)"), 
+   B = str_extract(col2, "(?<=B\\:).*?(?=\\|)"), 
+   C = str_extract(col2, "(?<=C\\:).*?$") 
+ ) 

この操作の後data.frame dfは次のとおりです。

> df 
# A tibble: 2 x 5 
    Id         col2    A  B   C 
    <int>         <chr>   <chr> <chr>  <chr> 
1  1 A:frog's legs|B:popcorn|C:white_wine! frog's legs popcorn white_wine! 
2  2  A:banana SUNDAE|B:[email protected]$%^|C:123456 banana SUNDAE [email protected]#$%^  123456 

正規表現がどのように動作するか

正規表現が|が一致するため(最初の文字列で)A:ための後読みと先読みを使用していますこれら2つの間のすべての文字。 2番目の文字列の文字はB:です。 3番目の文字列では、文字列の末尾までC:に続くすべての文字と一致します。

警告

上記は、分離文字|がランダム文字列になりません想定しています。上記のランダムな文字列内の

> df 
# A tibble: 2 x 2 
    Id         col2 
    <int>         <chr> 
1  1 A:frog's l|egs|B:popcorn|C:white_wine! 
2  2  A:banana SUNDAE|B:[email protected]|$%^|C:123456 

|文字:そうでない場合は、正規表現は、このことを考慮して微調整する必要があります。私たちは、このことを考慮して、正規表現の先読み部分を変更します。

> df <- df %>% 
+ mutate(A = str_extract(col2, "(?<=A:).*?(?=\\|B:)"), 
+   B = str_extract(col2, "(?<=B:).*?(?=\\|C:)"), 
+   C = str_extract(col2, "(?<=C:).*?$") 
+ ) 
> df 
# A tibble: 2 x 5 
    Id         col2    A  B   C 
    <int>         <chr>   <chr> <chr>  <chr> 
1  1 A:frog's l|egs|B:popcorn|C:white_wine! frog's l|egs popcorn white_wine! 
2  2  A:banana SUNDAE|B:[email protected]|$%^|C:123456 banana SUNDAE [email protected]|$%^  123456 
0

あなたがこれを使用することもできます:

library(stringr) 
xt <- "A:randomString|B:randomString|C:randomString" 
colnm <- unlist(str_extract_all(xt, "[A-Z](?=:)")) 
values <- setNames(data.frame(rbind(unlist(str_extract_all(xt,"(?![A-Z]:)\\w+")))), colnm) 

出力

print(values) 
      A   B   C 
1 randomString randomString randomString 
関連する問題