2016-08-12 95 views
0

我想通過使用原始列相互減去創建新列,我用字符來表達所有新列的組合,然後我想用dplyr::mutate來創建新的列。 foo <- eval(parse(text = paste(new.feature,collapse = ",")))有問題,謝謝你的回答。有關使用字符串作爲函數參數在R

col.names <- names(iris) 
sign.paste <- function(x){paste(x,collapse = "-")} 
new.feature <- apply(combn(col.names,2),2,sign.paste) 
paste(new.feature,collapse = ",") 
foo <- eval(parse(text = paste(new.feature,collapse = ","))) 
dplyr::mutate(iris,foo) 

當我使用paste(new.feature,collapse = ","),我會得到這樣的

paste(new.feature,collapse = ",") 
[1]「Sepal.Length-Sepal.Width,Sepal.Length-Petal.Length,Sepal.Length字符-Petal.Width,Sepal.Length品種,Sepal.Width-Petal.Length,Sepal.Width-Petal.Width,Sepal.Width品種,Petal.Length-Petal.Width,Petal.Length品種,Petal.Width 「物種」

終於,我想我們e mutate創建新列,但失敗..

回答

1

您不能只是混合和匹配字符串和適當的語言表達式。如果可能,最好避免eval()。這裏有一種方法來構建一個表達式來定義所有的減法,然後執行它。

col.names <- names(iris)[sapply(iris, is.numeric)] 
sign.paste <- function(x){substitute(x-y, list(x=as.name(x[1]), y=as.name(x[2])))} 
new.feature <- apply(combn(col.names,2),2,sign.paste) 

dplyr::mutate_(iris,.dots=new.feature) 

請注意,現在sign.paste返回語言表達式列表,而不是字符串。如果您評估了字符串,這基本上就是您設置的。然後我們確保使用mutate_這是mutate函數的標準評估版本。它允許我們將參數作爲一個大列表而不是單獨的參數傳遞。有關更多信息,請參閱vignette("nse")。 (我也僅限於數字欄以避免關於減法因素的警告)