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
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
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