あなたは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
をtidyr( 'ライブラリを試してみてください); df1%>%mutate(col2 = gsub( ".:"、 "col2))%>%separate(col2、into = c( 'A'、 'B'、 'C')) ' – akrun
多くの助けになりました!私が今使っている問題は、 "C:randomString"の場合、ランダムな文字列にはアンダースコアが含まれているためです(実際には "C:random_String"に似ています)ので、この文字列が別の列に分割されます。 – newToCoding13