分隔多个值数字(带字符)和文本
Posted
技术标签:
【中文标题】分隔多个值数字(带字符)和文本【英文标题】:Separating multiple value numbers (with characters) and text 【发布时间】:2017-08-16 00:03:11 【问题描述】:我在 Excel 中有一个文件,例如,单元格中包含诸如“4.56/505AB”之类的文本。 数字各不相同,文本长度也不同,因此文本可以是单个字符或多个字符,并且数字可以包含小数点或斜线等字符。
此示例的理想分隔格式是:第 1 列 = 4.56/505,第 2 列 = AB。
我尝试过的: Excel 中的“Split_Text”,它从数字中删除了特殊字符,并导致以下输出:第 1 列 = 456505,第 2 列 = ./AB
R 使用“G_sub”命令,结果为:[1]“4 . 56 / 505 AB”
有没有办法进一步采用这些方法,或者这将是手动修复?谢谢!
【问题讨论】:
你需要在r中使用strsplit()
。
除了base R
解决方案之外,包中有多种功能,例如stringr
可以帮助您。
【参考方案1】:
假设第一个大写字母是第二列的开头
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
【讨论】:
【参考方案2】: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
更新:修订。
【讨论】:
以上是关于分隔多个值数字(带字符)和文本的主要内容,如果未能解决你的问题,请参考以下文章
如何在数字字段的条件下将逗号分隔的数字字符串传递给存储过程?