2016-08-03 14 views
8

Sáng nay trong khi thực hiện một số phân tích với khung dữ liệu, tôi gặp lỗi do sự hiện diện của tên cột trùng lặp. Tôi đã cố gắng để tìm một giải pháp bằng cách sử dụng dplyr độc quyền nhưng tôi không thể tìm thấy bất cứ điều gì mà các công trình. Đây là một ví dụ để minh họa vấn đề. Một khung dữ liệu có tên cột trùng lặp.xóa cột bị trùng lặp dplyr

x <- data.frame(matrix(c(1, 2, 3), 
       c(2,2,1),nrow=2,ncol=3)) 
colnames(x) <- c("a", "a", "b") 

Khi tôi cố gắng thả cột đầu tiên sử dụng lệnh select tôi nhận được một lỗi

x %>% 
    select(-1)%>%filter(b>1) 

Error: found duplicated column name: a 

tôi có thể thoát khỏi cột dễ dàng sử dụng chỉ mục truyền thống và sử dụng dplyr để lọc theo giá trị

x<-x[,-1]%>%filter(b>1) 

nào tạo ra kết quả mong muốn

> x 
    a b 
1 2 3 
2 2 3 

Bất kỳ ý tưởng nào về cách thực hiện điều này chỉ sử dụng ngữ pháp dplyr?

+2

Vâng trong cơ sở R, "quyền" cách có thể là 'x [! trùng lặp (tên (x), fromLast = TRUE)]'. Chỉ cần tìm một cách để quăng nó vào động từ 'select' của dplyr. Huh, thậm chí 'x%>% select (2,3)' không hoạt động, rên rỉ về LHS trước khi nhìn vào mệnh đề 'select'. Tôi sẽ gọi đó là một lỗi. Cách giải quyết thô: 'x%>% do (. [! Duplicate (tên (.), FromLast = TRUE)])' – Frank

+0

Tôi thường chỉ sử dụng 'make.names' để đổi tên mọi thứ một cách hợp pháp. – alistaire

+1

Nếu bạn đào xung quanh tôi nghĩ rằng bạn sẽ tìm thấy gốc của cái ác ở đây nằm trong thực tế là plyr và dplyr sử dụng tên cột để chọn dữ liệu. Điều này YÊU CẦU các cột có tên duy nhất, nó không chọn theo tên và nội dung. Gói cơ sở sử dụng các chỉ mục, mà sẽ làm việc mà không quan tâm đến việc đặt tên các mô hình. Nó là một giới hạn của gói, cũng có giá trị giới hạn hầu hết thời gian. – sconfluentus

Trả lời

2

Điều này có thể hoạt động, tận dụng lợi thế của hành vi make.names. Không biết nếu tôi đã lừa dối ở đây, nhưng có vẻ như chủ yếu là để tận dụng các chức năng dplyr.

x %>% 
    setNames(make.names(names(.), unique = TRUE)) %>% 
    select(-matches("*\\.[1-9]+$")) 
0

Nếu bạn muốn thoát khỏi cột đầu tiên hoàn toàn Tôi chỉ sẽ làm

x <- x[, c(2:3)] 

Hoặc cách khác bạn có thể đổi tên nó

colnames(x)[1] <- "a.1" 
Các vấn đề liên quan