分隔多个值编号(带字符)和文本

时间:2017-08-16 00:03:12

标签: r excel

我在Excel中有一个文件,例如,这个" 4.56 / 505AB"在一个牢房里。 数字全部变化,文本长度也不同,因此文本可以是单个或多个字符,数字可以包含小数点或斜杠标记等字符。

此示例的理想分离格式为:第1列= 4.56 / 505,第2列= AB。

我尝试过的事情: " Split_Text"在Excel中,从数字中删除了特殊字符,并产生以下输出:第1列= 456505,第2列= ./AB

R与" G_sub"命令导致:[1]" 4。 56/505 AB"

有没有办法进一步采用这些方法,还是手动修复?谢谢!

2 个答案:

答案 0 :(得分:0)

假设第一个大写字母是第二列的开头

df <- data.frame(c1 = c("4.56/505AB", "1.23/202CD"))

library(stringr)
df$c2 <- str_extract(df$c1, "[^[A-Z]]+")
df$c3 <- str_extract(df$c1, "[A-Z]+") 

df
#           c1       c2 c3
# 1 4.56/505AB 4.56/505 AB
# 2 1.23/202CD 1.23/202 CD

答案 1 :(得分:0)

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。此外,我们假设输入中没有分号,但如果有分号,那么在分号出现的两个地方使用输入中没有出现的其他字符代替分号。

1a)如果我们可以假设第二列总是以字母开头,那么我们可以直接替换分号后跟该字母所遇到的第一个字母,然后使用read.table读取它。这样做的好处是可以使用更简单的图案。

read.table(text = sub("([[:alpha:]])", ";\\1", x), sep = ";", as.is = TRUE)

2)read.pattern 使用相同的输入x和模式pat,使用gsubfn包中的read.pattern会更短:

library(gsubfn)
read.pattern(text = x, pattern = pat, as.is = TRUE)
##         V1 V2
## 1 4.56/505 AB

更新:修订。