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
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? –
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
'*' 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