2014-05-22 12 views
7

Các yếu tố có thể giúp ngăn ngừa một số lỗi lập trình trong R: Bạn không thể thực hiện kiểm tra bình đẳng cho các yếu tố sử dụng các cấp khác nhau và bạn được cảnh báo khi thực hiện lớn hơn/ít hơn kiểm tra các yếu tố không có thứ tự.An toàn hợp nhất khung dữ liệu theo các cột yếu tố

a <- factor(letters[1:3]) 
b <- factor(letters[1:3], levels=letters[4:1]) 
a == b 
## Error in Ops.factor(a, b) : level sets of factors are different 
a < a 
## [1] NA NA NA 
## Warning message: 
## In Ops.factor(a, a) : < not meaningful for factors 

Tuy nhiên, trái với mong đợi của tôi, việc kiểm tra này không được thực hiện khi sáp nhập các khung dữ liệu:

ad <- data.frame(x=a, a=as.numeric(a)) 
bd <- data.frame(x=b, b=as.numeric(b)) 
merge(ad, bd) 
## x a b 
## 1 a 1 4 
## 2 b 2 3 
## 3 c 3 2 

Những yếu tố đơn giản dường như bị cưỡng chế ký tự.

Có phải "hợp nhất an toàn" có sẵn ở đâu đó để thực hiện kiểm tra không? Bạn có thấy lý do cụ thể để không thực hiện kiểm tra này theo mặc định không?

Ví dụ (trường hợp sử dụng thực tế): Giả sử hai bộ dữ liệu không gian có phân số rất giống nhau nhưng không giống nhau ở các xã. Các bộ dữ liệu đề cập đến các điểm hơi khác nhau về thời gian và một số xã đã sáp nhập trong khoảng thời gian đó. Mỗi tập dữ liệu có một cột "ID xã", thậm chí có thể được đặt tên giống nhau. Trong khi ngữ nghĩa của cột này rất giống nhau, tôi không muốn (vô tình) hợp nhất các tập dữ liệu trên cột ID xã này. Thay vào đó, tôi xây dựng một bảng phù hợp giữa ID xã "cũ" và "mới". Nếu các ID xã được mã hóa dưới dạng các yếu tố, một "hợp nhất an toàn" sẽ cho phép kiểm tra tính chính xác cho hoạt động hợp nhất mà không tốn thêm chi phí (thực hiện) và chi phí tính toán rất ít.

+0

IIUC, bạn muốn có lỗi trong trường hợp này vì các cấp không khớp? – Arun

+0

@Arun: Trong nhiều trường hợp sử dụng, tôi thích lỗi hơn hoặc ít nhất là cảnh báo. – krlmlr

+0

Tôi hiểu. Ngoài sự tò mò, bạn nghĩ điều này không an toàn theo cách nào? – Arun

Trả lời

0

Vâng, với tín dụng nhiều (và lời xin lỗi tới) MrFlick:

> attributes(ad$x) 
$levels 
[1] "a" "b" "c" 

$class 
[1] "factor" 


> attributes(ad$a) 
NULL 

> attributes(ad$b) 
NULL 

> adfoo<-merge(ad,bd) 

> attributes(adfoo$x) 
$levels 
[1] "a" "b" "c" 

$class 
[1] "factor" 

Vì vậy, trong thực tế, cột sáp nhập $x là một yếu tố, mặc dù chỉ có mức chung cho cả adbd được sáp nhập. Các cột khác đã bị ép buộc qua as.numeric từ lâu.

+0

Tôi không thấy nơi 'data.frame' đang loại bỏ thuộc tính' factor' khỏi các giá trị ban đầu. Bằng chứng về điều đó là gì? – MrFlick

+0

@MrFlick thử chạy 'thuộc tính (a)' và 'thuộc tính (quảng cáo)'. Xin vui lòng không đổ trên bài viết mà không cần điều tra đầu tiên. –

+0

Tôi không bán phá giá; Tôi đã điều tra đầu tiên đó là lý do tại sao tôi đã nhầm lẫn. Tôi đã so sánh 'thuộc tính (a)' và 'thuộc tính (quảng cáo $ x)' giống hệt nhau. Tôi đã rất ngạc nhiên khi thấy bạn nhìn vào 'thuộc tính (quảng cáo)'. Một 'data.frame' chỉ là một tập hợp các vectơ. Bản thân 'data.frame' không nhận các thuộc tính của bất kỳ một trong các cột của nó cũng như không thuộc tính() đệ quy đệ quy các phần tử phụ. 'Data.frame' có thể chứa các thừa số với các mức khác nhau:' dd <-data.frame (x = chữ cái [1: 2], y = chữ cái [11:12]), mức (dd $ x); các cấp độ (dd $ y) ' – MrFlick

1

"Bảo vệ an toàn" với merge là thông số by=. Bạn có thể đặt chính xác những cột nào bạn cho là phù hợp. Nếu bạn kết hợp hai cột yếu tố, R sẽ sử dụng các nhãn cho các giá trị đó để khớp chúng. Vì vậy, "a" sẽ khớp với "a" bất kể cách thức hoạt động bên trong ẩn của yếu tố đã mã hóa các giá trị đó. Đó là những gì người dùng nhìn thấy, vì vậy đó là cách nó sẽ được hợp nhất. Nó giống như với các giá trị số, bạn có thể chọn hợp nhất trên các cột có các phạm vi khác nhau hoàn chỉnh (cột đầu tiên có 1:10, cột thứ hai có 100: 1000). Khi giá trị by được đặt, R sẽ thực hiện theo yêu cầu. Và nếu bạn không thiết lập rõ ràng tham số by, thì R sẽ tìm tất cả các tên cột được chia sẻ trong hai data.frames và sử dụng nó.

Và nhiều lần khi hợp nhất, bạn không phải lúc nào cũng mong đợi các kết quả phù hợp. Đôi khi bạn đang sử dụng all.x hoặc all.y để nhận cụ thể các bản ghi chưa khớp. Trong trường hợp này, tùy thuộc vào cách các data.frames khác nhau được tạo ra, người ta có thể không biết về các cấp nó không có. Vì vậy, nó không phải ở tất cả các bất hợp lý để cố gắng hợp nhất chúng. Vì vậy, về cơ bản R là các yếu tố xử lý như các ký tự trong quá trình hợp nhất, là nguyên nhân giả định rằng bạn đã biết rằng hai cột thuộc về nhau.

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