2014-07-14 13 views
5

我想知道是否可以通過替換命令將取消引用傳遞給表達式的字符串。在R的替代命令中取消引用字符串

具體而言,我使用dplyr過濾和從數據幀中選擇:

> w 
     subject sex response 
    1  1 M 19.08 
    2  2 M 16.46 
    ...  ... ... ... 
    6  6 M 23.60 
    7  7 M 23.96 
    8  8 F 22.48 
    9  9 F 25.79 
    ...  ... ... ... 
    16  16 F 26.66 

下面產生所需的結果:

> w %.% filter(sex == "M") %.% select(response)   
     response 
    1 19.08 
    2 16.46 
    3 22.81 
    4 18.62 
    5 18.75 
    6 23.60 
    7 23.96 

但我想這樣做以更一般的辦法。由於字符串「sex」用引號引起來,因此以下不會產生所需的結果。

代用品(w%以下。%濾波器(Y == 「M」),則列表(Y =膏(名稱(w)的[2])))

w %.% filter("sex" == "M") 
    > eval(substitute(w %.% filter(y == "M"), list(y = paste(names(w)[2])))) 
    [1] subject sex  response 
    <0 rows> (or 0-length row.names) 

我可以總是請執行以下操作:

eval(parse(text = paste("w %.% filter(", names(w)[2], " == 'M')"))) 

但是,看起來有點笨拙。

有沒有更優雅的方式來做到這一點?最後,我想把它包裝在一個函數中,使其更加通用。

任何幫助/建議將不勝感激。

親切的問候,

斯特凡

+0

類似的Q&A [**這裏**]( http://stackoverflow.com/questions/22005419/dplyr-without-hard-coding-the-variable-names/22012451#22012451) – Henrik

+4

嘗試'as.nam e()' – hadley

+0

謝謝,我不知道'as.name()',直到akrun在他的回答中使用它。 – Stefan

回答

2

可能是你可以嘗試:

w <- structure(list(subject = c(1L, 2L, 6L, 7L, 8L, 9L, 16L), sex = structure(c(2L, 
2L, 2L, 2L, 1L, 1L, 1L), .Label = c("F", "M"), class = "factor"), 
response = c(19.08, 16.46, 23.6, 23.96, 22.48, 25.79, 26.66 
)), .Names = c("subject", "sex", "response"), class = "data.frame", row.names = c("1", 
"2", "6", "7", "8", "9", "16")) 

基於@哈德利的意見

eval(substitute(w%>% filter(y=="M"), list(y=as.name(names(w)[2])))) 
+0

+1。如果你想更新一個例子(我即將發佈),你可以使用'mtcars%>%filter(get(paste(names(mtcars)[2]),envir = as.environment(mtcars))= = 4)%>%select(mpg)':-) – A5C1D2H2I1M1N2O1R2T1

+0

@Ananda Mahto,謝謝。我更新了帖子中顯示的數據集。我猜'粘貼'是不需要的。 – akrun

+0

沒有。這不是 - 我想我只是「翻譯」了OP的方法,並沒有真正關注:-) – A5C1D2H2I1M1N2O1R2T1