R使用R中的字符串参考(部分)数据帧

时间:2015-05-26 02:16:09

标签: r

我有一个大型数据集,我必须根据我的需要搜索特定代码。例如,化学疗法由~40个代码编码,可以出现在40个列中的任何一个列中(diag1,diag2等)。

我正在编写一个根据我想要显示的内容生成绘图的函数。我认为在输入数据框中指定我想要绘制的内容会很好。因此,例如,如果我只想为患者绘制化疗事件,我会有一个这样的数据框:

Dataframe name: Style
 Name   SearchIn                                codes         PlotAs  PlotColour
 Chemo  data[substr(names(data),1,4)=="diag"]  1,2,3,4,5,6     |       red

我已经有了一个函数,可以搜索数据框特定部分的代码并标记感兴趣的事件。 我不能做的,需要你的帮助,指的是使用上述数据框中的代码的数据框(Style $ SearchIn [1])。

> Style$SearchIn[1]
[1] data[substr(names(data),1,4)=="diag"]
Levels:  data[substr(names(data),1,4)=="diag"] 

我想也许get()会起作用,但我无法让它起作用:

> get(Style$SearchIn[1])
Error in get(vars$SearchIn[1]) : invalid first argument
enter code here

> get(as.character(Style$SearchIn[1]))
Error in get(as.character(Style$SearchIn[1])) :   
object 'data[substr(names(data),1,5)=="TDIAG"]' not found

显然,运行数据[substr(names(data),1,5)==" TDIAG"] 有效。

示例:

  library(survival)
  ex <- data.frame(SearchIn="lung[substr(names(lung),1,2) == 'ph']")

  lung[substr(names(lung),1,2) == 'ph'] #works
  get(ex$SearchIn[1]) # does not work

2 个答案:

答案 0 :(得分:3)

将R代码存储在字符串中然后尝试在需要时进行评估并不是一个好主意;对于动态逻辑,几乎总是有更好的解决方案,例如lambdas。

我建议使用列表来存储绘图规范,而不是data.frame。这将允许您将函数作为列表组件之一包含,该组件可以获取输入数据并返回其子集以进行绘图。

例如:

library(survival);

plotFromSpec <- function(data,spec) {
    filteredData <- spec$filter(data);
    ## ... draw a plot from filteredData and other stuff in spec ...
};

spec <- list(
    Name='Chemo',
    filter=function(data) data[,substr(names(data),1,2)=='ph'],
    Codes=c(1,2,3,4,5,6),
    PlotAs='|',
    PlotColour='red'
);
plotFromSpec(lung,spec);

如果要存储多个规范,可以创建列表列表。

答案 1 :(得分:2)

您是否尝试过使用quote()

我不完全确定你想要什么,但也许你可以存储你想要的东西get()喜欢

quote(data[substr(names(data),1,4)=="diag"])

然后使用eval()

eval(quote(data[substr(names(data),1,4)=="diag"]), list(data=data))

例如,

dat <- data.frame("diag1"=1:10, "diag2"=1:10, "other"=1:10)
Style <- list(SearchIn=c(quote(data[substr(names(data),1,4)=="diag"]), quote("Other stuff")))

> head(eval(Style$SearchIn[[1]], list(data=dat)))
  diag1 diag2
1     1     1
2     2     2
3     3     3
4     4     4
5     5     5
6     6     6