【问题标题】:How to generate data frame variable name on the fly and address existing data frame variable with it?如何动态生成数据框变量名称并使用它来处理现有数据框变量?
【发布时间】:2019-11-21 01:57:23
【问题描述】:

我想做这样的事情:

df <- data.frame("v1"=c(1,2,3), "v2"=c(1,2,3), "v3"=c(1,2,3), "v4"=c(1,2,3))

a <- 2

paste0("df$v", a)
get(paste0("df$v", a))
mget(paste0("df$v", a))

输出应该是df$v2控制台打印的内容。

问题:我这样做的主要原因是我想用动态生成的变量名来处理数据框变量。我不想生成新的变量名,我只想为现有的变量名生成可用于寻址它的变量名。我怎样才能做到这一点?

【问题讨论】:

    标签: r metaprogramming


    【解决方案1】:

    简答:使用[[ 而不是$,例如df[[paste0("v",a)]].

    get() 一般不推荐使用,但如果需要使用,则需要分两步完成:

    get("df")[[paste0("v",a)]]
    

    (正如@RonakShah 所建议的那样,假设您知道您将查看df 并使用df[[paste0("v",a)]] 会更惯用)

    如果你坚持使用$,可以使用eval(parse(.))

    eval(parse(text=paste0("df$v",a)))
    

    【讨论】:

    • 如果我需要介于get("df")[[paste0("v",a)]]eval(parse(text=paste0("df$v",a))) 之间,你推荐了哪一个,为什么?
    • get() 绝对比eval(parse(...)) 更好(或至少不那么差)。 eval(parse(...)) 对其评估的环境更敏感,通常不太稳健
    【解决方案2】:

    你可以在这里使用eval, parse(

    eval(parse(text = paste0("df$v", a)))
    #[1] 1 2 3
    

    但是,我认为这不是访问变量的好方法。除了动态生成 df$v2 之外,您可以只动态生成 v2 以便您可以这样做

    df[[paste0("v", a)]]
    #[1] 1 2 3
    

    【讨论】:

    • [[$ 对齐比[ , .] 更好
    猜你喜欢
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多