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

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

更新:修订。

【讨论】:

以上是关于分隔多个值数字(带字符)和文本的主要内容,如果未能解决你的问题,请参考以下文章

将数字格式化为字符串-带小数和千位分隔符

FreeMarker 将带逗号的字符串转换为数字

如何在数字字段的条件下将逗号分隔的数字字符串传递给存储过程?

Swift:由字符串分隔的组件

Excel 2013 - 单元格中的多个数字作为文本字符串,需要识别是否小于某个值

填充数字格式的时间表达式,具有带前导零的可变分隔符