分隔多个值(字符)和文本
我在Excel中有一个文件,例如在单元格中有这样的“4.56 / 505AB”文本。 数字与文本的长度一样都是不同的,所以文本可以是单个或多个字符,数字可以包含小数点或斜线等字符。
这个例子的理想分离格式是:列1 = 4.56 / 505,列2 = AB。
我已经尝试过了:Excel中的“Split_Text”,它从数字中删除了特殊字符,并生成以下输出:column 1 = 456505,column 2 = ./AB
R与“G_sub”命令,导致:[1]“4. 56/505 AB”
有没有办法进一步采取这些方法,或将这是一个手动修复? 谢谢!
假设第一个大写字母是第二列的开始
df <- data.frame(c1 = c("4.56/505AB", "1.23/202CD")) library(stringr) df$c2 <- str_extract(df$c1, "[^[AZ]]+") df$c3 <- str_extract(df$c1, "[AZ]+") df # c1 c2 c3 # 1 4.56/505AB 4.56/505 AB # 2 1.23/202CD 1.23/202 CD
1)sub / read.table匹配两个捕获组中的前导字符和尾随字符,并用分号分隔。 然后阅读使用read.table。 没有包被使用。
x <- "4.56/505AB" pat <- "^([0-9.,/]+)(.*)" read.table(text = sub(pat, "\\1;\\2", x), sep = ";", as.is = TRUE) ## V1 V2 ## 1 4.56/505 AB
结果有字符列,但如果你喜欢因素,那么省略as.is = TRUE
。 我们还假定在input中没有分号,但是如果有的话使用其他字符,而不是在分号出现的两个地方用分号input。
1a)如果我们可以假定第二列总是以一个字母开始,那么我们可以用分号后面跟着这个字母来代替遇到的第一个字母,然后用read.table读取它。 这具有使用简单的图案的优点。
read.table(text = sub("([[:alpha:]])", ";\\1", x), sep = ";", as.is = TRUE)
2)read.pattern使用相同的inputx
和模式pat
,使用gsubfn包中的read.pattern甚至更短:
library(gsubfn) read.pattern(text = x, pattern = pat, as.is = TRUE) ## V1 V2 ## 1 4.56/505 AB
更新:修改。