使用Stringr清理数据

使用Stringr清理数据,r,stringr,R,Stringr,我有一个包含两列的数据表,第一列包含Id变量,第二列包含字符串。第二列中的字符串的格式为 “A:randomString | B:randomString | C:randomString” 我想将该表更改为有4列:Id、A、B和C。Id将保持不变,A将在每个A:,B将在每个B:,C将在每个C:,后面有随机字符串 是否可以使用stringr执行此操作?您可以使用stringr::str_extract()和正则表达式执行此操作,使用: 使用dplyr::mutate()创建新的列A、B和C: &

我有一个包含两列的数据表,第一列包含Id变量,第二列包含字符串。第二列中的字符串的格式为

“A:randomString | B:randomString | C:randomString”

我想将该表更改为有4列:Id、A、B和C。Id将保持不变,A将在每个A:,B将在每个B:,C将在每个C:,后面有随机字符串


是否可以使用stringr执行此操作?

您可以使用
stringr::str_extract()
和正则表达式执行此操作,使用:

使用
dplyr::mutate()
创建新的列A、B和C:

> df <- df %>%
+   mutate(A = str_extract(col2, "(?<=A\\:).*?(?=\\|)"),
+          B = str_extract(col2, "(?<=B\\:).*?(?=\\|)"),
+          C = str_extract(col2, "(?<=C\\:).*?$")
+   )
正则表达式的工作原理 正则表达式使用
A:
(在第一个字符串中)的lookback和
|
的lookahead来匹配这两个字符串之间的所有字符。第二个字符串
B:
同上。对于第三个字符串,它匹配
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:!@|$%^|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:!@|$%^|C:123456 banana SUNDAE  !@|$%^      123456

可以使用
stringr::str_extract()
和正则表达式执行此操作,正则表达式使用:

使用
dplyr::mutate()
创建新的列A、B和C:

> df <- df %>%
+   mutate(A = str_extract(col2, "(?<=A\\:).*?(?=\\|)"),
+          B = str_extract(col2, "(?<=B\\:).*?(?=\\|)"),
+          C = str_extract(col2, "(?<=C\\:).*?$")
+   )
正则表达式的工作原理 正则表达式使用
A:
(在第一个字符串中)的lookback和
|
的lookahead来匹配这两个字符串之间的所有字符。第二个字符串
B:
同上。对于第三个字符串,它匹配
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:!@|$%^|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:!@|$%^|C:123456 banana SUNDAE  !@|$%^      123456

您可以选择使用以下选项:

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)

您可以选择使用以下选项:

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)

尝试
库(tidyr);df1%>%变异(col2=gsub(“.:”,“,”,col2))%>%分离(col2,into=c('A','B','c'))
这帮了大忙!我现在遇到的问题是,对于“C:randomString”,随机字符串包含一个下划线(因此它实际上更像“C:random_string”。这会导致此字符串拆分为不同的列。请尝试
library(tidyr);df1%>%mutate(col2=gsub(.:“,”,col2))%>%separate(col2,into=C('A','B','C'))
这帮了大忙!我现在遇到的问题是,对于“C:randomString”,随机字符串包含一个下划线(因此它实际上更像“C:randomString”)。这导致该字符串被拆分为不同的列。