2017-03-17 54 views
1

我做了一个使用dplyr的函数。我可以使用get()select_()选择参数,但不适用于mutate()dplyr:在select_()和mutate()中使用环境变量

这是我使用的代码。

创建测试数据:

test <- tibble(Q1=c(NA,NA,NA,4,5), 
     Q2=c(1,2,NA,NA,NA), 
     Q3=c(NA,NA,3,NA,NA), 
     Group=c("B", "B", "C", "A", "A")) 

这将返回错误。

## Create y column 
create_y <- function(x1, x2, x3, Group){ 
    length <- length(x1) 
    res <- c() 
    for (i in 1:length){ 
     if(Group[i]=="A") 
      res <- c(res, x1[i]) 
     if(Group[i]=="B") 
      res <- c(res, x2[i]) 
     if(Group[i]=="C") 
      res <- c(res, x3[i]) 
    } 
    return(res) 
} 

reg_figure <- function(var1, var2, var3){ 
    test %>% select_(.dots=c(get("var1"), get("var2"), get("var3"), "Group")) %>% 
    mutate(y=create_y(as.name(get("var1")), as.name(get("var2")), as.name(get("var3")), Group)) 
} 

reg_figure("Q1", "Q2", "Q3") # error 

我想这样的结果:

| Q1 | Q2 | Q3 | Group | y | 
|----|----|----|-------|---| 
| NA | 1 | NA | B  | 1 | 
| NA | 2 | NA | B  | 2 | 
| NA | NA | 3 | C  | 3 | 
| 4 | NA | NA | A  | 4 | 
| 5 | NA | NA | A  | 5 | 

回答

1

使用.[[get("var1")]]得到的tibble列作为载体。

reg_figure <- function(var1, var2, var3){ 
    test %>% select_(.dots=c(get("var1"), get("var2"), get("var3"), "Group")) %>% 
    mutate(y=create_y(.[[get("var1")]], .[[get("var2")]], .[[get("var3")]], Group)) 
} 
reg_figure("Q1", "Q2", "Q3")