使用Stringr清理数据
我有一个包含两列的数据表,第一列包含Id变量,第二列包含字符串。第二列中的字符串的格式为使用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: &
“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”)。这导致该字符串被拆分为不同的列。