我的数据框看起来像这样:
Var
H2307
A123
F45fjhsk
category
J30HS
我希望它看起来像这样:
Var Var_1 Var_2
H2307 H 2307
A123 A 123
F45fjhsk NA NA
category NA NA
J30HS J 30HS
我尝试过各种变体:
for (i in 1:length(dat$Var)){
if (nchar(dat$Var) < 7){
tx <- strsplit(dat$Var[i], split = "(?<=[a-zA-Z])(?=[0-9])", perl = T)
tx <- t(matrix(tx, nrow=2, ncol=length(tx)/2))
}
}
越来越接近我想但仍然没有工作;分裂部分工作得很好。我有&#34;&lt; 7&#34;因为我要分割的所有字符串都少于7个字符,所以它排除了&#34; F45fjhsk&#34;条目。
答案 0 :(得分:3)
以下是tidyr::extract
的一个选项:
library(tidyr)
df <- df %>%
extract(Var, into=c("Var_1", "Var_2"), regex="^(?=.{1,7}$)([a-zA-Z]+)([0-9].*)$", remove=FALSE)
df
# Var Var_1 Var_2
#1 H2307 H 2307
#2 A123 A 123
#3 F45fjhsk <NA> <NA>
#4 category <NA> <NA>
#5 J30HS J 30HS
^(?=.{1,7}$)
asserts the total number of characters小于或等于7; ([a-zA-Z]+)
匹配字符串开头的非数字部分; ([0-9].*)
匹配第一个数字后的所有内容。
答案 1 :(得分:2)
看起来你的regEx排除了在第二组中出现信件的可能性
([a-zA-Z])(.+)
通过在第二个集合中使用(。+),您也可以处理这种情况。