2015-02-12 15 views
5

Làm cách nào để gán biến macro trong R?Làm cách nào để sử dụng biến macro trong R? (Tương tự như% LET trong SAS)

Trong SAS, tôi sẽ sử dụng đoạn mã sau

%LET DEPVAR = sales_ind 

PROC REG DATA=mydata; 
MODEL &DEPVAR = VAR1 + VAR2; 
RUN; 

Tuy nhiên, trong R, tôi đang đấu tranh để làm điều gì đó tương tự (điều này không làm việc)

depvar <<- sales_ind 

reg<-lm(depvar ~ var1 + var2, data=mydata) 

Bất kỳ ý tưởng?

Cảm ơn bạn!

Trả lời

6

thế nào về điều này:

reg<-lm(formula(paste(depvar ,'~ var1 + var2')), data=mydata) 
+0

Điều đó có vẻ hiệu quả! Cảm ơn bạn Jthorpe. Nó ít trực quan hơn so với giải pháp SAS - –

+1

Trong R bạn có thể chỉ định một công thức (biểu thức) qua 'a ~ b + c', hoặc bạn có thể tạo một chuỗi với công thức và gọi' công thức() 'để tạo một công thức dựa trên chuỗi.(PS. Nếu nó là giải pháp hoạt động, bạn có thể đánh dấu nó chính xác để đóng câu hỏi) – Jthorpe

+0

Tôi sẽ - nó nói với tôi rằng tôi cần phải chờ 10 phút trước khi tôi có thể đánh dấu nó chính xác –

12

cách tiếp cận Jthorpe là một giải pháp tốt.

Tuy nhiên, hãy để tôi cung cấp giải pháp thay thế, vì tôi không thích đi đường vòng qua các chuỗi ký tự phải được phân tích cú pháp và không cần thiết ở đây.

R cho phép bạn thao tác các biểu thức trong thời gian chạy (không mã hóa chúng dưới dạng chuỗi, nghĩa là), thông qua một tập hợp các chức năng như substitute hoặc bquote. bquote lẽ đến gần nhất với cách tiếp cận SAS:

depvar = quote(sales.int) 
reg = lm(bquote(.(depvar) ~ var1 + var2), mydata) 

bquote về cơ bản có một biểu thức R, và thay thế tất cả các biến được bao quanh bởi .(…) bởi giá trị của nó. Dòng đầu tiên gán một tên cho một biến - điều này rất giống với macro thực tế trong SAS. Điều này cần được bao quanh bởi quote, vì nếu không R sẽ cố gắng chỉ định nội dung của sales.int đến depvar, thay vì tên của nó. quote hoạt động giống hệt với bquote, ngoại trừ việc bạn không thể sử dụng cú pháp .(…) trong đó để thay thế các biến hiện có.

Bạn cũng có thể xác định tên này từ một đầu vào người sử dụng (ví dụ từ một chuỗi ký tự, bằng cách sử dụng as.name:.

depvar = as.name('sales.int') 

as.name chuyển đổi một chuỗi ký tự để một tên đối tượng R


Chỉ cần một bình luận về thiết kế ngôn ngữ, vì đây là một sự hiểu lầm phổ biến: R có thể ít trực quan hơn SAS trong vấn đề này, nhưng nó là khái niệm phù hợp hơn và thường áp dụng. Các gói thống kê phi R về bản chất cung cấp các hacks để làm việc xung quanh ngôn ngữ trong khi R tích hợp các công thức đẹp vào chính ngôn ngữ đó.

+0

Tôi chưa bao giờ thấy cách tiếp cận này trước đây - cảm ơn bạn rất nhiều! –

-1

Không ai trong số họ hoạt động. Biến macro được gọi với & trong SAS nhưng không giống như & đang được sử dụng trong R mặc dù bạn có thể sử dụng new = as.name ("f3") hoặc new = quote (f3) để tham chiếu đến f3 như được hiển thị bên dưới.

> test<-data.frame(f1=c(1,2), f2=c("a","b")); test 
# f1 f2 
#1 1 a 
#2 2 b 

> new=as.name("f3"); new; 
#f3 
> new=quote(f3); new; 
#f3 

> # you still get new rather than f3 as expected 
> new<-test$f1; 
> new 
#[1] 1 2 
Các vấn đề liên quan