2015-06-10 24 views
6

Tôi đang làm sạch dữ liệu. Tôi sử dụng mutate trong Dplyr rất nhiều vì nó tạo ra các cột mới theo từng bước và tôi có thể dễ dàng thấy nó như thế nào.R dplyr, sử dụng biến thể với na.omit gây ra lỗi không tương thích với kích thước (% d)

Dưới đây là hai ví dụ mà tôi có lỗi này

Error: incompatible size (%d), expecting %d (the group size) or 1 

Ví dụ 1: Nhận tên thành phố từ mã bưu điện. Dữ liệu đơn giản như sau:

Zip 
1 02345 
2 02201 

Và tôi nhận thấy khi dữ liệu có NA trong đó, dữ liệu không hoạt động.

Without NA nó hoạt động:

library(dplyr) 
library(zipcode) 
data(zipcode) 

test = data.frame(Zip=c('02345','02201'),stringsAsFactors=FALSE) 

test %>% 
    rowwise() %>% 
    mutate(Town1 = zipcode[zipcode$zip==na.omit(Zip),'city']) 

dẫn đến

Source: local data frame [2 x 2] 
Groups: <by row> 

    Zip Town1 
1 02345 Manomet 
2 02201 Boston 

Với NA nó không hoạt động:

library(dplyr) 
library(zipcode) 
data(zipcode) 

test = data.frame(Zip=c('02345','02201',NA),stringsAsFactors=FALSE) 

test %>% 
    rowwise() %>% 
    mutate(Town1 = zipcode[zipcode$zip==na.omit(Zip),'city']) 

dẫn đến

Error: incompatible size (%d), expecting %d (the group size) or 1 

Ví dụ2. Tôi muốn loại bỏ tên trạng thái dư thừa xảy ra trong cột Town trong các dữ liệu sau.

  Town State 
1 BOSTON MA MA 
2 NORTH AMAMS MA 
3 CHICAGO IL IL 

Đây là cách tôi làm: (1) chia chuỗi thành phố thành các từ, ví dụ: 'BOSTON' và 'MA' cho hàng 1. (2) xem có bất kỳ những lời này phù hợp với Nhà nước của dòng đó (3) xóa dòng chữ xuất hiện

library(dplyr) 
test = data.frame(Town=c('BOSTON MA','NORTH AMAMS','CHICAGO IL'), State=c('MA','MA','IL'), stringsAsFactors=FALSE) 

test %>% 
    mutate(Town.word = strsplit(Town, split=' ')) %>% 
    rowwise() %>% # rowwise ensures every calculation only consider currect row 
    mutate(is.state = match(State,Town.word)) %>% 
    mutate(Town1 = Town.word[-is.state]) 

Điều này dẫn đến:

  Town State Town.word is.state Town1 
1 BOSTON MA MA <chr[2]>  2 BOSTON 
2 NORTH AMAMS MA <chr[2]>  NA  NA 
3 CHICAGO IL IL <chr[2]>  2 CHICAGO 

Ý nghĩa: Ví dụ: hàng 1 hiển thị is.state == 2, có nghĩa là từ thứ 2 trong Thị trấn là tên tiểu bang. Sau khi loại bỏ công việc đó, Town1 là tên thị trấn chính xác.

Bây giờ tôi muốn sửa chữa NA trong dòng 2, nhưng thêm na.omit sẽ gây ra lỗi:

test %>% 
    mutate(Town.word = strsplit(Town, split=' ')) %>% 
    rowwise() %>% # rowwise ensures every calculation only consider currect row 
    mutate(is.state = match(State,Town.word)) %>% 
    mutate(Town1 = Town.word[-na.omit(is.state)]) 

kết quả trong:

Error: incompatible size (%d), expecting %d (the group size) or 1 

Tôi đã kiểm tra kiểu dữ liệu và kích thước :

test %>% 
    mutate(Town.word = strsplit(Town, split=' ')) %>% 
    rowwise() %>% # rowwise ensures every calculation only consider currect row 
    mutate(is.state = match(State,Town.word)) %>% 
    mutate(length(is.state)) %>%  
    mutate(class(na.omit(is.state))) 

kết quả bằng:

  Town State Town.word is.state length(is.state) class(na.omit(is.state)) 
1 BOSTON MA MA <chr[2]>  2    1     integer 
2 NORTH AMAMS MA <chr[2]>  NA    1     integer 
3 CHICAGO IL IL <chr[2]>  2    1     integer 

Vì vậy, đó là% d chiều dài == 1. Ai đó có thể sai? Cảm ơn

Trả lời

3

Bạn có thể chỉ cần sub không?

test %>% 
    rowwise() %>% 
    mutate(Town=sub(sprintf('[, ]*%s$', State), '', Town)) 
## Source: local data frame [3 x 2] 
## Groups: <by row> 
## 
##   Town State 
## 1  BOSTON MA 
## 2 NORTH AMAMS MA 
## 3  CHICAGO IL 

(Bằng cách này cũng bắt dấu phẩy sau khi thị trấn, nếu điều đó xảy ra.)

NB: nếu bạn sử dụng ungroup() ở đây với một rowwise_df (vì đây là), nó sẽ lau lớp tbl_df cũng và tạo ra một data.frame thẳng, đó là tốt cho dữ liệu của bạn nhưng sẽ clobber màn hình của bạn nếu bạn không cẩn thận và đang tìm kiếm một lượng lớn dữ liệu (như tôi đã làm vô số lần). (Tham chiếu Github #936#553.)

+0

Cảm ơn rất nhiều @ r2evans! [,] Có nghĩa là dấu phẩy + không gian tùy chọn không? [] Có nghĩa là một cái gì đó tùy chọn? –

+0

Dấu ngoặc vuông nhóm không gian và dấu phẩy lại với nhau trong một lớp, nói "một trong hai (hai) ký tự", mặc dù nó có thể nhiều hơn hai và bao gồm các phạm vi (chẳng hạn như '[A-Za-z0-9]' có nghĩa là "một chữ cái trên hoặc dưới hoặc một số"). Regex là một tác phẩm nghệ thuật, và rất khó để tìm ra một đoạn trích/tham khảo tốt. [Wikibooks-R] (http://en.wikibooks.org/wiki/R_Programming/Text_Processing#Regular_Expressions) là một tài liệu tham khảo tốt. – r2evans

+0

'*' sau khi nó làm cho bất cứ điều gì ngay lập tức trước nó tùy chọn, chẳng hạn như lớp khung vuông '[,]'. Nó được đọc là "0 hoặc nhiều hơn". Sử dụng một '+' thay vì làm cho nó "1 hoặc nhiều hơn". Cả hai đều cho phép lặp lại các ký tự hoặc các lớp ký tự. – r2evans

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