2015-05-26 103 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