我有一个大型数据集,我必须根据我的需要搜索特定代码。例如,化学疗法由~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
答案 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