从对象名称中提取元素

时间:2014-07-28 17:52:49

标签: r

我有一个对象名称

Test12<-c(8,7,4,3,5,67,3,9,6,6,56,742,23,12,45,56)

我想从对象名称或Test12中提取最后两个数字,以分别获取数字1和2,并将它们放入两个对象中。

a<- 1
b<- 2

我试过

x <- name(Test12)

substrRight <- function(x, n){
substr(x, nchar(x)-n+1, nchar(x))
}
substrRight(x, 2)
[1] "8"  "7"  "4"  "3"  "5"  "67" "3"  "9"  "6"  "6"  "56" "42" "23" "12" "45" "56"

但是我得到了每个对象元素的最后2个元素。

欢迎任何帮助

3 个答案:

答案 0 :(得分:1)

您可以使用:

substrRight <- function(x, n){
    substr(x, nchar(x)-n+1, nchar(x))
}

var.name <- deparse(substitute(test12))
var.nums <- substrRight(var.name, 2) 
var.nums <- strsplit(var.nums, "")
var.nums <- unlist(var.nums)
var.nums <- as.vector(as.numeric(var.nums))

答案 1 :(得分:1)

nm <- bquote(Test12)
nm <- quote(Test12)
nm <- "Test12"
根据@ Al.Sal

的回答nm <- deparse(substitute(Test12))

会工作,然后:

a <- substr(nm, nchar(nm)-1, nchar(nm)-1)
b <- substr(nm, nchar(nm), nchar(nm))
> a
[1] "1"
> b
[1] "2"

答案 2 :(得分:1)

您也可以尝试

 library(stringr)
 list2env(setNames(
        as.list(str_extract_all(deparse(substitute(Test12)),
                        perl("\\d(?=\\b$)|\\d(?=[0-9]$)"))[[1]]),
                       letters[1:2]),
                              envir=.GlobalEnv)

   a
  #[1] "1"
    b
  #[1] "2"

解释

 deparse(substitute(Test12)) #gets the name of the object
 #[1] "Test12"

正则表达式"\\d(?=\\b$)匹配数字lookahead,用于字符串|末尾的字边界或\\d(?=[0-9]$)")数字,lookahead代表另一位数字字符串。

假设你的字符串是:

 T95es34t12 <- 1:5
  str_extract_all(deparse(substitute(T95es34t12)),  perl("\\d(?=\\b$)|\\d(?=[0-9]$)"))[[1]]
 #[1] "1" "2"

as.list创建一个列表,然后使用a使用bsetNames命名列表元素,并使用list2env指定列表名称列表值的元素。