代码之家  ›  专栏  ›  技术社区  ›  Kingindanord

将变量转换为R中的字符

  •  1
  • Kingindanord  · 技术社区  · 7 年前

    我想把变量的名字记在 a b

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

    我怎样才能代替手工写呢?

    3 回复  |  直到 7 年前
        1
  •  3
  •   Dmitrii I.    7 年前

    a 表达式 list(EURUSD, USDJPY, CADJPY)

    您可以尝试解析 ls() :在命名空间中查找所有6个字符的all caps名称。

    例子:

    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"
    
        2
  •  1
  •   akrun    7 年前

    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
    
        3
  •  0
  •   G. Grothendieck    7 年前

    我们无法创建 a 然后通过检查确定进入其中的变量名 从那时起 变量名丢失;然而,我们可以创建一个函数 namify 未传递到的 但是 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) 分别是姓名和未命名列表。

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