dplyr rowwise mutate,没有硬编码名称

时间:2016-07-01 21:26:19

标签: r dplyr

我想做这样的事情

df <- iris %>%
  rowwise %>%
  mutate(new_var = sum(Sepal.Length, Sepal.Width))

除非我想在不输入变量名的情况下这样做,例如

names_to_add <- c("Sepal.Length", "Sepal.Width")
df <- iris %>%
  rowwise %>%
[some function that uses names_to_add]

我尝试了一些例子。

df <- iris %>%
  rowwise %>%
  mutate(new_var = sum(sapply(names_to_add, get, envir = as.environment(.))))

但仍然无法弄明白。我会采用与lazyeval或更简单的东西相关的答案。请注意,这里的sum函数只是一个占位符,我的实际函数要复杂得多,尽管它每行返回一个值。我也不愿意使用data.table

2 个答案:

答案 0 :(得分:0)

您应该查看_中以dplyr结尾的所有功能。示例mutate_summarise_

names_to_add <- ("sum(Sepal.Length, Sepal.Width)")   

df <- iris %>%
  rowwise %>% mutate_(names_to_add)

修改

代码的结果:

df <- iris %>%
 rowwise %>% mutate(new_var = sum(Sepal.Length, Sepal.Width))

names_to_add <- ("sum(Sepal.Length, Sepal.Width)")   

df2 <- iris %>%
    rowwise %>% mutate_(new_var = names_to_add)

identical(df, df2)
[1] TRUE

答案 1 :(得分:-1)

修改

我编辑了答案,它解决了问题。我想知道为什么它被donwvoted。

我们使用SE(标准评估),在'mutate_'中传递一个字符串作为输入。更多信息:vignette("nse","dplyr")

x <- "Sepal.Length + Sepal.Width"
df <- mutate_(iris, x)
head(df)

输出:

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species Sepal.Length + Sepal.Width
1          5.1         3.5          1.4         0.2  setosa                        8.6
2          4.9         3.0          1.4         0.2  setosa                        7.9
3          4.7         3.2          1.3         0.2  setosa                        7.9
4          4.6         3.1          1.5         0.2  setosa                        7.7
5          5.0         3.6          1.4         0.2  setosa                        8.6
6          5.4         3.9          1.7         0.4  setosa                        9.3