我在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 ")
答案 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$V1
和DF$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"