什么命令可以解析字符变量中的字母和数字?

时间:2019-02-06 18:28:01

标签: r regex

我在R中有一个字符(字符串)对象,该对象同时包含数字和字母。在R环境中查看时,它返回为:

 [1] " Sample Size =   955"
 [2] " Importance      0.861"
 [3] " Value      0.475 " 

此对象中还有很多行,但这就是格式。本质上,每一行都以双引号开头和结尾,即“某些文本内含数字”,但是所有这些数据都在一个R对象(即字符)内。 我要拥有的只是从该对象中提取数字。因此,在上面的示例中,我想获得另一个对象,例如z,仅包含955、0.861、0.475。同样,是否有一个仅从每一行提取文本的函数?所以我会得到一个包含样本大小,重要性,值的对象y。

数据

x <- c(" Sample Size =   955", " Importance      0.861", " Value      0.475 ")

2 个答案:

答案 0 :(得分:1)

修剪两端的空白,删除所有等号,并用逗号(如果逗号可以出现,则替换其他字符)代替最后一个空格。然后使用read.table阅读。不使用任何软件包。

read.table(text = sub("=", "", sub("(.*) ", "\\1,", trimws(x))), 
  sep = ",", as.is = TRUE, strip.white = TRUE)

给予:

           V1      V2
1 Sample Size 955.000
2  Importance   0.861
3       Value   0.475

如果DF是结果数据帧,则DF$V1DF$V2是两列。

答案 1 :(得分:0)

您可以使用正则表达式解决此问题。这是根据您的示例提供的可能解决方案:

library(stringr)
vec <- c(" Sample Size =   955", " Importance      0.861", " Value      0.475 ")

str_extract(string = vec, pattern = "[0-9]{1,}(\\.)?[0-9]{0,}")
[1] "955"   "0.861" "0.475"
str_extract(string = vec, pattern = "[a-zA-Z]{1,}(\\s)?[a-zA-Z]{1,}")
[1] "Sample Size" "Importance"  "Value"  

第一个规则将查找具有1个或多个数字的数字,后跟一个可能的.和另一个可能的0或多个数字的数字。 同样,第二条规则将查找包含1个或多个字符的字符串,后跟一个可能的空格(\\s)和另一个包含1个或多个字符的字符串。

编辑:

如果一行中有多个数字怎么办?

在这种情况下,我认为最好的选择是打破每个元素,然后应用一个函数来获取所需的模式。为了举例说明,我在第一个条目上添加了另一个数字:

library(stringr)
vec <- c(" Sample Size =   955 95", " Importance      0.861", " Value      0.475 ")
vec_aux <- str_split(string = vec, pattern = " ")

f1 <- function(x) str_extract(string = x, pattern = "[0-9]{1,}(\\.)?[0-9]{0,}")
f2 <- function(x) str_extract(string = x, pattern = "[a-zA-Z]{1,}(\\s)?[a-zA-Z]{1,}")

out1 <- lapply(X = vec_aux, FUN = f1)
lapply(out1, function(x) x[!is.na(x)])

[[1]]
[1] "955" "95" 

[[2]]
[1] "0.861"

[[3]]
[1] "0.475"

out2 <- lapply(X = vec_aux, FUN = f2)
lapply(out2, function(x) x[!is.na(x)])

[[1]]
[1] "Sample" "Size"  

[[2]]
[1] "Importance"

[[3]]
[1] "Value"