我想通过使用原始列相互减去来创建新列,我使用字符来表达新列的所有组合,然后我想使用dplyr::mutate
来创建新列。 foo <- eval(parse(text = paste(new.feature,collapse = ",")))
有问题,谢谢你的回答。
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]&#34; Sepal.Length-Sepal.Width,Sepal.Length-Petal.Length,Sepal.Length-Petal.Width,Sepal.Length-Species,Sepal.Width-Petal.Length,Sepal.Width-Petal .WIDTH,Sepal.Width品种,Petal.Length-Petal.Width,Petal.Length品种,Petal.Width-物种&#34;
最后,我想使用mutate
创建新列,但失败了..
答案 0 :(得分: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")
。 (我也仅限于数字列,以避免有关减去因子的警告)