我认为这很简单,但是我看不到我所缺少的。我想在第一位数分割字符串。除非字符串中包含非字母数字符号,否则效果很好。救命!
作品:
pet<-c("Dog 100","Cat? 340")
df<-as.data.frame(pet)
df_split<-separate(df, pet, into = c("Animal", "Total"), sep = "(?<=[a-zA-Z])\\s*(?=[0-9])")
第一行效果很好,但第二行未拆分。我要去哪里错了?
答案 0 :(得分:0)
我们可以使用read.table
中的base R
read.table(text = sub("?", "", df$pet, fixed = TRUE), header = FALSE,
col.names = c("Animal", "Total"))
# Animal Total
#1 Dog 100
#2 Cat 340
答案 1 :(得分:0)
请注意,对于当前情况,足以用1+个空格分隔,然后在字符串末尾加上1+个数字:
> separate(df, pet, into = c("Animal", "Total"), sep = "\\s+(?=[0-9]+$)")
## => Animal Total
## => 1 Dog 100
## => 2 Cat? 340
请参见regex demo。
但是,一般情况下,在这里使用tidyr::extract
要容易得多,因为所需的模式会更加简单:
^(\D*?)\s*(\d.*)
请注意,如果您的字符串可以包含换行符,则需要在模式前面加上(?s)
,即所谓的DOTALL修饰符,该修饰符允许.
匹配ICU模式中的换行符。 / p>
请参见regex demo。
正则表达式详细信息
^
-字符串的开头(\D*?)
-第1组(此处为Animal
列):任意0+个非数字符号,应尽可能少\s*
-0个或多个空格(\d.*)
-第2组(此处为Total
列):一个数字,后跟任意0+个字符(如果不使用(?s)
,则为换行符)可能(*
是贪婪的量词)。R代码段:
library(tidyr)
df_split<-extract(df, pet, into = c("Animal", "Total"), regex="(\\D*)(\\d.*)")
df_split
# => Animal Total
# => 1 Dog 100
# => 2 Cat? 340