【问题标题】:Evaluate dataframe$column expression stored as a string value评估存储为字符串值的 dataframe$column 表达式
【发布时间】:2016-09-20 18:37:41
【问题描述】:

可以计算以下形式的字符串,使其等效于相同的“文字”表达式吗?

示例数据和代码:

df.name = data.frame(col1 = 1:5, col2 = LETTERS[seq(1:5)], col3 = letters[seq(1:5)], stringsAsFactors = FALSE)
col.name = "col2"
row.num = "4"

var1 = str_c("df.name$", col.name,"[",row.num,"]")

> var1
[1] "df.name$col2[4]"

文字按预期工作

> df.name$col2[4]
[1] D

get() 不等价:

get(var1)
## Error in get(var1) : object 'df.name$col2[4]' not found

get() 这种形式“有效”但不能解决问题

get("df.name")$col2[4]
[1] D

根据其他帖子,我尝试过 eval(parse())eval(parse(text())) 均未成功。

我正在尝试创建一个函数,该函数将使用传递给函数的col.name 搜索(子集)df.name。我想避免为每个列名编写单独的函数,尽管这样可以工作,因为我可以将 df.name$col2[row.num] 编码为“文字”。

编辑

示例代码应该将 row.num 显示为数字/整数类型,即row.num = 4

【问题讨论】:

  • 将代码解析为字符串永远不是答案。 df.name[[col.name]][as.numeric(row.num)] 对您来说是一种可能。但我认为你应该问问自己你是如何以行号的字符表示结束的,然后从那里开始。
  • 如果你真的需要这样做,eval(parse(text=var1)) 应该可以工作(它对我有用)。但是@RichScriven 的解决方案(但使用get(df.name) 而不是df.name)应该可以工作。
  • @Rich Scriven - 行号来自“for 循环”。示例代码只是为了展示构造。手头的任务是不可矢量化的,因为未来的行取决于先前行的结果。同样,对于需要从中检索值的每一列,我可以通过单独的函数来避免 paste/str_c。但是,如果我可以将列名作为参数传递给函数,那么我只需要一个函数。

标签: r get eval


【解决方案1】:

你快到了:

> eval(parse(text = var1))
[1] "D"

由于默认解析期望文件,需要指定text参数。

【讨论】:

    【解决方案2】:

    我正在尝试创建一个函数,该函数将使用传递给函数的 col.name 搜索(子集)df.name。

    设置数据:

    df.name = data.frame(col1 = 1:5, col2 = LETTERS[1:5], ## seq() is unnecessary
                         col3 = letters[1:5], 
                         stringsAsFactors = FALSE)
    col.name = "col2"
    row.num = "4"
    

    解决你的终极问题(按列名索引数据框)而不是你的近端问题(弄清楚如何使用get()/eval() 等)问题:正如@RichardScriven 指出的那样,

    f <- function(col.name,row.num,data=df.name)
       return(data[[col.name]][as.numeric(row.num)])
    }
    

    应该可以。如果可能的话,如果您将行号指定为数字而不是字符,这可能会更惯用......

    【讨论】:

    • 我将编辑我的问题,注意示例行号应该更合适地是 numeric()。
    猜你喜欢
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    相关资源
    最近更新 更多