2015-03-29 19 views
5

Trong dplyr chạy trên khung R dữ liệu, nó rất dễ dàng để chạyifelse & lệnh grepl khi sử dụng dplyr cho SQL trong db hoạt động

df <- df %>% 
    mutate(income_topcoded = ifelse(income > topcode, income, topcode) 

Tôi hiện đang làm việc với một cơ sở dữ liệu SQL lớn, sử dụng dplyr để gửi lệnh đến máy chủ SQL. Khi tôi chạy cùng một lệnh, tôi nhận lại

Error in postgresqlExecStatement(conn, statement, ...) : 
RS-DBI driver: (could not Retrieve the result : ERROR: 
function ifelse (boolean, numeric, numeric) does not exist 
HINT: No function matches the given name and argument types. You may need to add explicit type casts. 

Bạn đề xuất triển khai ifelse() câu lệnh như thế nào? Tôi muốn được tốt với một cái gì đó trong PivotalR (mà dường như hỗ trợ ifelse(), nhưng tôi không biết làm thế nào để tích hợp nó với dplyr và không thể tìm thấy bất kỳ ví dụ về SO), một số phần của cú pháp SQL mà tôi có thể sử dụng trong- dòng ở đây, hoặc một số tính năng của dplyr mà tôi đã không biết.

(Tôi có cùng một vấn đề mà tôi muốn sử dụng grepl() như một hoạt động trong db, nhưng tôi không biết làm thế nào để làm như vậy.)

+0

Bạn có thể thuật lại câu hỏi của mình để đặt câu hỏi cụ thể, lập trình không? Vì nó đứng ngay bây giờ nó có một cơ hội tốt để được đóng như là off-topic (tìm kiếm một công cụ, hướng dẫn ...). –

+0

Xin chào Roman, cảm ơn vì mẹo! Chỉ cần viết lại nó. Nếu tôi có câu hỏi về biểu mẫu "tìm kiếm công cụ" trong tương lai, bạn sẽ đề xuất tôi đăng bài ở đâu? – ganong

+0

Tôi thực sự không biết. Có lẽ một danh sách gửi thư đề cập đến một chủ đề tương tự? Tôi thường chỉ thực hiện tìm kiếm trên internet hoặc yêu cầu trong phòng trò chuyện R ở đây trên SO. –

Trả lời

5

Dựa trên trả lời @ hadley về this thread, bạn có thể sử dụng một SQL kiểu if() tuyên bố bên mutate() trên dplyr trong-db dataframes:

df <- df %>% 
    mutate(income_topcoded = if (income > topcode) income else topcode) 

Theo như sử dụng grepl() đi ... tốt, bạn có thể 't. Nhưng bạn có thể sử dụng toán tử SQL like:

df <- df %>% 
    filter(topcode %like% "ABC%") 
1

Tôi đã có một vấn đề tương tự. Điều tốt nhất tôi có thể làm là sử dụng một hoạt động trong db như bạn đề nghị:

topcode <- 10000 
queryString <- sprintf("UPDATE db.table SET income_topcoded = %s WHERE income_topcoded > %s",topcode,topcode) 
dbGetQuery(con, queryString) 

Trong trường hợp của tôi, tôi đã sử dụng MySQL với dplyr, nhưng nó đã không thể dịch ifelse() vào SQL hợp lệ của tôi.

+0

điều này là khá sạch sẽ và tôi sẽ sử dụng nó về phía trước. cảm ơn! (không cho nó một kiểm tra vì tôi vẫn hy vọng rằng những người sáng tạo của dplyr sẽ xây dựng chức năng này trong tương lai) – ganong

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