2017-07-18 27 views
5

Tôi đang cố gán một tên cột cho một biến bằng cách sử dụng biến đổi.sử dụng biến đổi dplyr() trong lập trình

df <-data.frame(x = sample(1:100, 50), y = rnorm(50)) 

new <- function(name){ 
    df%>%mutate(name = ifelse(x <50, "small", "big")) 
} 

Khi tôi chạy

new(name = "newVar") 

nó không hoạt động. Tôi biết mutate_() có thể giúp nhưng tôi đang gặp khó khăn trong việc sử dụng nó cùng với ifelse.

Mọi trợ giúp sẽ được đánh giá cao.

+0

Bạn đang thiếu ')' ở cuối 'mutate' và' mutate' được viết sai chính tả. Ngoài ra, hãy cẩn thận khi gọi một biến toàn cục như 'df' trong hàm của bạn. Sẽ an toàn hơn khi truyền 'df' làm đối số cho hàm của bạn. – juan

+0

'mutate_' đang bị loại bỏ. Cập nhật 'dplyr' và gõ 'vignette ('programming', 'dplyr')' – Axeman

+0

Các gói của tôi được cập nhật. – Kay

Trả lời

9

Sử dụng dplyr 0.7.1 và tiến bộ của mình trong NSE, bạn phải UQ đối số đến mutate và sau đó sử dụng := khi chỉ định. Có rất nhiều thông tin về lập trình với dplyr và NSE tại đây: https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html

Tôi đã thay đổi tên của đối số chức năng thành myvar để tránh nhầm lẫn. Bạn cũng có thể sử dụng case_when từ dplyr thay vì ifelse nếu bạn có nhiều danh mục hơn để giải mã.

df <- data.frame(x = sample(1:100, 50), y = rnorm(50)) 

new <- function(myvar){ 
    df %>% mutate(UQ(myvar) := ifelse(x < 50, "small", "big")) 
} 

new(myvar = "newVar") 

này trả

 x  y newVar 
1 37 1.82669 small 
2 63 -0.04333 big 
3 46 0.20748 small 
4 93 0.94169 big 
5 83 -0.15678 big 
6 14 -1.43567 small 
7 61 0.35173 big 
8 26 -0.71826 small 
9 21 1.09237 small 
10 90 1.99185 big 
11 60 -1.01408 big 
12 70 0.87534 big 
13 55 0.85325 big 
14 38 1.70972 small 
15 6 0.74836 small 
16 23 -0.08528 small 
17 27 2.02613 small 
18 76 -0.45648 big 
19 97 1.20124 big 
20 99 -0.34930 big 
21 74 1.77341 big 
22 72 -0.32862 big 
23 64 -0.07994 big 
24 53 -0.40116 big 
25 16 -0.70226 small 
26 8 0.78965 small 
27 34 0.01871 small 
28 24 1.95154 small 
29 82 -0.70616 big 
30 77 -0.40387 big 
31 43 -0.88383 small 
32 88 -0.21862 big 
33 45 0.53409 small 
34 29 -2.29234 small 
35 54 1.00730 big 
36 22 -0.62636 small 
37 100 0.75193 big 
38 52 -0.41389 big 
39 36 0.19817 small 
40 89 -0.49224 big 
41 81 -1.51998 big 
42 18 0.57047 small 
43 78 -0.44445 big 
44 49 -0.08845 small 
45 20 0.14014 small 
46 32 0.48094 small 
47 1 -0.12224 small 
48 66 0.48769 big 
49 11 -0.49005 small 
50 87 -0.25517 big 
+0

': =' đến từ 'data.table'? – Wen

+1

@Wen Không, tôi nghĩ ': =' xuất phát từ 'rlang', được sử dụng bởi phiên bản 0.7.1 của' dplyr'. Xem tại đây để biết thêm thông tin: https://cran.r-project.org/web/packages/dplyr/vignettes/programming.html – meenaparam

1

giải pháp cơ sở R

df <-data.frame(x = sample(1:100, 50), y = rnorm(50)) 

new <- function(name){ 
    df[,name]='s' 
    df[,name][df$x>50]='b' 
    return(df) 
} 

Tôi đang sử dụng dplyr 0.5 vì vậy tôi chỉ cần kết hợp cơ sở R với mutate

new <- function(Name){ 

    df=mutate(df,ifelse(x <50, "small", "big")) 
    names(df)[3]=Name 
    return(df) 
} 

new("newVar") 
6

Tiếp theo dlyr programming vignette, xác định chức năng của bạn như sau:

new <- function(name) 
{ 
    nn <- enquo(name) %>% quo_name() 
    df %>% mutate(!!nn := ifelse(x <50, "small", "big")) 
} 

enquo mất lập luận biểu hiện của nó và trích dẫn nó, tiếp theo là quo_name chuyển đổi nó thành một chuỗi . Vì nn hiện được trích dẫn, chúng tôi cần phải thông báo cho mutate để không báo giá lần thứ hai. Đó là những gì !! dành cho. Cuối cùng, := là một toán tử trợ giúp để mã R hợp lệ. Lưu ý rằng với định nghĩa này, bạn có thể chỉ cần chuyển newVar thay vì "newVar" vào chức năng của mình, duy trì kiểu dplyr.

> new(newVar) %>% head 
    x   y newVar 
1 94 -1.07642088 big 
2 85 0.68746266 big 
3 80 0.02630903 big 
4 74 0.18323506 big 
5 86 0.85086915 big 
6 38 0.41882858 small 
+0

câu trả lời của meenaparam được chấp nhận nhưng câu trả lời của bạn cũng không nghi ngờ gì nữa và câu trả lời đó sẽ giúp ích cho người khác chức năng tôi đang viết. Cảm ơn – Kay

+0

Đồng ý, tôi nghĩ rằng đây là một câu trả lời thực sự hữu ích quá! – meenaparam

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