2014-10-28 15 views
15

CẬP NHẬT: Từ nhận xét bên dưới về bài đăng này, điều này hiện đang hoạt động như mong đợi, không có vấn đề tôi nêu ra ở đây.dplyr 'đổi tên' chức năng đánh giá tiêu chuẩn không hoạt động như mong đợi?

Dưới đây là ví dụ về đồ chơi sử dụng rename_ từ dplyr. Tôi đã mong đợi để có thể thay đổi tên cột trở lại tên ban đầu của nó bằng cách sử dụng ví dụ thứ hai bên dưới, nhưng tôi đoán rằng các quy tắc đánh giá đối số chức năng bằng cách nào đó ngăn cản nó hoạt động theo cách tôi nghĩ. Có một cách giải quyết dễ dàng bằng cách sử dụng gói plyr gốc rename chức năng (cũng như sử dụng gói cơ sở names chức năng), nhưng tôi có cảm giác tôi thiếu một giải pháp dplyr cho việc này.

Tôi có một giải pháp thay thế như hình bên dưới, nhưng tôi muốn chào cả giải pháp dplyr cho ví dụ thứ hai làm việc như tôi mong đợi hoặc giải thích lý do tại sao tôi không mong đợi nó hoạt động theo cách tôi muốn.

Cảm ơn bạn, Matt

EDIT: Tôi thêm một ví dụ dưới đây sử dụng rename_ để làm công việc này, nhưng rất phức tạp. Tôi cho rằng nếu lỗi mà Hadley đề cập bên dưới được khắc phục, điều này sẽ hoạt động như anh ta hiển thị bên dưới. Nhưng cho đến lúc đó, cách xử lý vụng về của tôi là có, nhưng có lẽ tốt hơn là sử dụng phương thức plyr tiêu chuẩn. Ngoài ra, thêm kỹ thuật R cơ sở ở cuối cho ví dụ đầy đủ.

library(plyr) 
library(dplyr) 

# dataframe to operate on 
dat <- data_frame(a=1, b=1) 

# identifier with string of column name in dat 
x <- "a" 


# Renaming using standard evaluation this way works 
dat %>% 
    rename_("new" = x) 
# Source: local data frame [1 x 2] 
# 
# new b 
# 1 1 1 


# But changing it back does not 
# I expect "a" to be the name, not the identifier x 
dat %>% 
    rename_("new" = x) %>% 
    rename_(x = "new") 
# Source: local data frame [1 x 2] 
# 
# x b 
# 1 1 1 


# This works, but seems really awkward... 
dat %>% 
    rename_("newname" = x) %>% 
    do(do.call(rename_, setNames(list(., "newname"), c(".data", x)))) 

# Source: local data frame [1 x 2] 
# 
# a b 
# 1 1 1 


# This works fine 
dat %>% 
    rename_("new" = x) %>% 
    plyr::rename(c("new" = x)) 
# Source: local data frame [1 x 2] 
# 
# a b 
# 1 1 1 


# Base R way 
datrn <- dat %>% 
    rename_("newname" = x) 
names(datrn)[names(datrn) == "newname"] = x 
datrn 
# Source: local data frame [1 x 2] 
# 
# a b 
# 1 1 1 
+8

Trong trường hợp có ai đó tự hỏi, 'rename_ (dat, .dots = setNames (x," new "))' hiện hoạt động như mong đợi. – cboettig

+0

Thông tin thêm về loại nội dung này có sẵn trong họa tiết dplyr về đánh giá không chuẩn: https://cran.r-project.org/web/packages/dplyr/vignettes/nse.html – RobinL

Trả lời

14

Có một vài điều mà làm cho đau đớn:

  1. c(x = "new") cũng giống như c("x" = "new"), và không phải là ngược lại của c(new = x).

  2. Bạn có thể xây dựng các vector bạn muốn với setNames(x, "new"), nhưng ...

  3. Tôi quên để thêm .dots lập luận để rename_ (báo cáo lỗi tại https://github.com/hadley/dplyr/issues/708) nên bạn không thể làm:

    rename_(dat, .dots = setNames(x, "new")) 
    

    Thay vào đó bạn cần phải sử dụng do.call:

    do.call(rename_, c(list(quote(dat)), list(setNames(x, "new")))) 
    
+0

Vì vậy, tôi đang cố gắng làm cho 'làm.call' ví dụ làm việc, và tôi không nhận được nó để làm việc. Bạn không chắc chắn cách thay đổi điều đó để kết hợp đối tượng 'dat' vào cuộc gọi đó, vì nó không được tham chiếu trong chính cuộc gọi đó. – mpettis

+0

Và, trong nhiều cách khác nhau để thử 'setNames', tôi nhận được loại lỗi sau đây:' Tất cả đối số để đổi tên phải được đặt tên.FALSE' – mpettis

+0

@mpettis do.call yêu cầu phải tốt hơn một chút – hadley

2

Trong Rstudio của tôi, tôi xác định:

x <- 'myname' 
dat <- data.frame(yes=1, no=2) 

Tôi muốn thay đổi tên biến từ -myname

Nó không làm việc:

rename_(dat, .dots = setNames(x, "yes")) 

Nhưng công trình này hoạt động:

rename_(dat, .dots = setNames("yes", x)) 

rename_(dat, .dots = setNames("yes", paste(x))) 
Các vấn đề liên quan