2017-07-03 20 views
7

Tôi đang cố gắng viết một hàm tùy chỉnh sẽ tính toán biến mới dựa trên các giá trị từ một biến số được xác định trước (vd: vector_heavy) và sau đó đặt tên biến mới dựa trên một đối số được cung cấp cho hàm (ví dụ: custom_name).Đặt tên cho một biến mới dựa trên độ sáng

Việc đặt tên biến này là nơi kỹ năng của tôi bị thất bại. Bất kỳ trợ giúp nào cũng được đánh giá rất cao.

library(tidyverse) 

vector_heavy <- quos(disp, wt, cyl) 

cv_compute <- function(data, cv_name, cv_vector){ 
    cv_name <- enquo(cv_name) 
    data %>% 
    rowwise() %>% 
    mutate(!!cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>% 
    ungroup() 
} 

d <- cv_compute(mtcars, cv_name = custom_name, cv_vector = vector_heavy) 

thông báo lỗi của tôi đọc:

Error: unexpected '=' in: 
" rowwise() %>% 
    mutate(!!cv_name =" 

Loại bỏ các !! trước cv_name trong mutate() sẽ dẫn đến một hàm tính toán biến mới theo nghĩa đen tên cv_name, và bỏ qua những custom_name Tôi đã bao gồm như một tranh luận.

cv_compute <- function(data, cv_name, cv_vector){ 
    cv_name <- enquo(cv_name) 
    data %>% 
    rowwise() %>% 
    mutate(cv_name = mean(c(!!!cv_vector), na.rm = TRUE)) %>% 
    ungroup() 
} 

Làm thế nào tôi có thể nhận được chức năng này để sử dụng các custom_name tôi cung cấp như một cuộc tranh cãi cho cv_name?

Trả lời

7

Bạn cần sử dụng trình trợ giúp := trong phạm vi mutate. Bạn cũng sẽ cần quo_name để chuyển đổi đầu vào thành chuỗi.

Dòng mutate chức năng của bạn sau đó sẽ trông giống như

mutate(!!quo_name(cv_name) := mean(c(!!!cv_vector), na.rm = TRUE))

Trong toàn bộ:

cv_compute <- function(data, cv_name, cv_vector){ 
    cv_name <- enquo(cv_name) 
    data %>% 
      rowwise() %>% 
      mutate(!!quo_name(cv_name) := mean(c(!!!cv_vector), na.rm = TRUE)) %>% 
      ungroup() 
} 

cv_compute(mtcars, cv_name = custom_name, cv_vector = vector_heavy) 

    mpg cyl disp hp drat wt qsec vs am gear carb custom_name 
    <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl> 
1 21.0  6 160 110 3.90 2.620 16.46  0  1  4  4 56.20667 
2 21.0  6 160 110 3.90 2.875 17.02  0  1  4  4 56.29167 
3 22.8  4 108 93 3.85 2.320 18.61  1  1  4  1 38.10667 
4 21.4  6 258 110 3.08 3.215 19.44  1  0  3  1 89.07167 
5 18.7  8 360 175 3.15 3.440 17.02  0  0  3  2 123.81333 
6 18.1  6 225 105 2.76 3.460 20.22  1  0  3  1 78.15333 
+0

giải pháp đẹp cảm ơn bạn! – Joe

Các vấn đề liên quan