将变量转换为R中的字符

时间:2017-07-28 12:07:55

标签: r string character

我想在a中获取变量的名称,并在b

中获取结果
a <- list(EURUSD,USDJPY,CADJPY)

b <- c("EURUSD", "USDJPY", "CADJPY")

我该怎么办而不是手动编写?

3 个答案:

答案 0 :(得分:3)

首先,R懒惰地评估,但是当您将列表分配给变量a时,表达式list(EURUSD, USDJPY, CADJPY)得到了评估。除非这三个对象被命名并且名称完全相同,否则无法获得它们的名称。

您可以尝试解析ls()的输出:在命名空间中查找所有6个字符的全部大写名称。

示例:

EURUSD <- runif(10)
USDJPY <- runif(10)
CADJPY <- runif(10)

blablabla <- 'unused variable'

currency_pairs <- ls(pattern='^[A-Z]{6}$')
print(currency_pairs)
[1] "CADJPY" "EURUSD" "USDJPY"

答案 1 :(得分:1)

我们可以使用substitute

f1 <- function(...) {
 v1 <- sapply(as.list(substitute(list(...)))[-1], deparse)
 v2 <- unlist(strsplit(v1, "list|[(), ]"))
 v2[nzchar(v2)]
 }

f1(EURUSD)
#[1] "EURUSD"

f1(list(EURUSD, USDJPY))
#[1] "EURUSD" "USDJPY"

f1(list(EURUSD,USDJPY,CADJPY))
#[1] "EURUSD" "USDJPY" "CADJPY"

数据

EURUSD <- 1:10
USDJPY <- 11:20
CADJPY <- 21:30

答案 2 :(得分:0)

我们无法创建a,然后通过检查a本身来确定进入它的变量名称,因为在创建a时,变量名称将丢失;但是,我们可以创建一个函数namify,而不是a而是list(EURUSD, USDJPY, CADJPY)。在这种情况下,函数可以解析输入表达式并对其进行评估。

namify <- function(x) {
    setNames(x, sapply(substitute(x)[-1], deparse))
}

# test it
EURUSD <- USDJPY <- CADJPY <- 1
L <- namify(list(EURUSD, USDJPY, CADJPY))

给出这个命名列表:

> L
$EURUSD
[1] 1

$USDJPY
[1] 1

$CADJPY
[1] 1

names(L)unname(L)分别是名称和未命名列表。

请注意,实现所有这一切的首选方法是首先从命名列表开始。例如,假设每个变量都存储在当前目录中的csv文件中:

csvFiles <- Sys.glob("*.csv")
L <- Map(read.csv, csvFiles)
names(L) <- sub("[.]csv$", "", names(L))   # remove .csv from names