2015-05-26 47 views
0

我有一个大型的数据集,我必须根据我想要的搜索特定的代码。例如,化疗由40个编码编码,可以出现在称为(diag1,diag2等)的40列中的任何一列中。R参考(部分)数据帧使用字符串在R

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

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(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(名字(数据),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 
+1

@TimBiegeleisen我不同意,我不认为这个问题写得不好。 OP只是在解决设计问题,并试图以不可取的方式使用数据框架和动态逻辑。我认为这个问题的总体意图是明确的。 – bgoldst

回答

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 
+0

它不是'data [substr(names(data),1,4)==“diag”]'does not work,它是Style $ SearchIn [1],不起作用。报价(Style $ SearchIn [1])不帮助我。Thnx – Luc

+0

@Luc您需要引用'data [']'和'eval()'Style $ SearchIn [1] –

+0

对不起,我不完全理解。你能写出来吗? – Luc

3

这不是存储在字符串R代码里面,然后尝试在需要时EVAL他们是个好主意;动态逻辑几乎总是有更好的解决方案,比如lambda。

我会建议使用列表来存储剧情规范,而不是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); 

如果你想存储多种规格,你可以创建一个列表的列表。

+0

这是一个有趣的想法...这个潜在的问题是我可以有几十个东西要包括,它可能会有所不同,从1个项目到另一个。我想我可以有一个列表中的每个项目,并结合列表,以便使完整的规格列表... – Luc

+0

编辑(10分钟后)mmmm我很努力如何使用这种方法与多个规格(如化学,手术,放疗) – Luc