2015-02-25 20 views
7

Tôi đang cố chuyển một số mã plyr thành dplyr và bị kẹt với chức năng đổi tên mới() trong dplyr. Tôi muốn có thể sử dụng lại một biểu thức đổi tên() duy nhất cho tập hợp các tập dữ liệu với các tên gốc trùng lặp nhưng không giống nhau. Ví dụ,Sử dụng đổi tên dplyr() bao gồm các tên biến không có trong tập dữ liệu

sample1 <- data.frame(A=1:10, B=letters[1:10]) 

sample2 <- data.frame(B=11:20, C=letters[11:20]) 

Và sau đó,

rename(sample1, var1 = A, var2 = B, var3 = C) 

Tôi muốn kết quả được rằng biến A được đổi tên thành var1, và B được đổi tên var2, không thêm một var3 trong trường hợp này. Thay vào đó, tôi nhận được

Lỗi: Unknown biến: C.

Ngược lại, cú pháp plyr sẽ cho phép tôi sử dụng

rename(sample1, c("A" = "var1", "B" = "var2", "C" = "var3")) 
rename(sample2, c("A" = "var1", "B" = "var2", "C" = "var3")) 

và không ném ra một lỗi. Có cách nào để có được kết quả tương tự trong dplyr mà không nhận được lỗi biến không xác định?

+0

Bạn có thể tham chiếu hàm đổi tên cụ thể từ plyr: 'plyr :: rename (ví dụ 1, c (" A "=" var1 "," B "=" var2 "," C " = "var3")) ' –

Trả lời

4

Hoàn toàn phớt lờ yêu cầu thực tế của bạn về làm thế nào để làm điều này với dplyr, tôi muốn đề nghị một cách tiếp cận khác nhau sử dụng một bảng tra cứu:

sample1 <- data.frame(A=1:10, B=letters[1:10]) 
sample2 <- data.frame(B=11:20, C=letters[11:20]) 

rename_map <- c("A"="var1", 
       "B"="var2", 
       "C"="var3") 

names(sample1) <- rename_map[names(sample1)] 
str(sample1) 

names(sample2) <- rename_map[names(sample2)] 
str(sample2) 

Về cơ bản các thuật toán rất đơn giản:

  1. Tạo bảng tra cứu tên biến hiện tại cho các tên mong muốn
  2. Sử dụng hàm name(), thực hiện tra cứu bản đồ với chỉ mục ánh xạ es và gán các biến được ánh xạ đó cho các cột thích hợp.

EDIT: Theo đề xuất của Hadley, tôi đã sử dụng một vector có tên thay vì danh sách, giúp cuộc sống trở nên dễ dàng hơn nhiều. Tôi luôn luôn quên các vector được đặt tên: (

+1

Bạn có thể thực hiện điều này khá đơn giản bằng cách sử dụng một vector ký tự có tên thay vì một danh sách có tên – hadley

+1

được chỉnh sửa, cảm ơn hadley – earino

+0

Nếu bạn chỉ muốn đặt tên cho một tập hợp con cột, điều này sẽ đặt tất cả các cột hiện có khác tên cho NA. –

1
#no need to use rename 

    oldnames<-unique(c(names(sample1),names(sample2))) 
    newnames<-c("var1","var2","var3") 
    name_df<-data.frame(oldnames,newnames) 
    mydata<-list(sample1,sample2) # combined two datasets as a list 
#one liner 
    finaldata <- lapply(mydata, function(i) {colnames(i)<-name_df[name_df[,1] %in% colnames(i),2] 
return(i)}) 
> finaldata 
[[1]] 
    var1 var2 
1  1 a 
2  2 b 
3  3 c 
4  4 d 
5  5 e 
6  6 f 
7  7 g 
8  8 h 
9  9 i 
10 10 j 

[[2]] 
    var2 var3 
1 11 k 
2 12 l 
3 13 m 
4 14 n 
5 15 o 
6 16 p 
7 17 q 
8 18 r 
9 19 s 
10 20 t 
Các vấn đề liên quan