2010-03-07 24 views
8

Như thường lệ, tôi nhận được một số tệp SPSS mà tôi đã nhập vào R với hàm spss.get từ gói Hmisc. Tôi bị làm phiền với lớp labelled rằng Hmisc::spss.get thêm vào tất cả các biến trong data.frame, do đó muốn xóa nó.Xóa nhãn biến gắn với chức năng nhập khẩu nước ngoài/Hmisc SPSS

labelled lớp cho tôi đau đầu khi tôi cố gắng chạy ggplot hoặc thậm chí khi tôi muốn thực hiện một số phân tích có tính đàn ông! Một giải pháp là xóa lớp labelled khỏi mỗi biến trong data.frame. Làm thế nào tôi có thể làm điều đó? Liệu có thể không? Nếu không, các lựa chọn khác của tôi là gì?

Tôi thực sự muốn bỏ qua các biến chỉnh sửa "từ đầu" với as.data.frame(lapply(x, as.numeric))as.character nếu có thể ... Và tôi chắc chắn không muốn chạy SPSS và xóa nhãn theo cách thủ công (không thích SPSS, cũng không quan tâm để cài đặt nó)!

Cảm ơn!

Trả lời

4

Bạn có thể tránh tạo các biến "có nhãn" trong spss.get với đối số:, use.value.labels = FALSE.

w <- spss.get('/tmp/my.sav', use.value.labels=FALSE, datevars=c('birthdate','deathdate')) 

Mã từ Bhattacharya có thể thất bại nếu lớp của vector dán nhãn được chỉ đơn giản là "dán nhãn" hơn là c ("dán nhãn", "yếu tố") trong trường hợp này nó cần phải có được:

class(x[[i]]) <- NULL # no error from assignment of empty vector 

Các lỗi bạn báo cáo có thể được sao chép với mã này:

> b <- 4:6 
> label(b) <- 'B Label' 
> str(b) 
Class 'labelled' atomic [1:3] 4 5 6 
    ..- attr(*, "label")= chr "B Label" 
> class(b) <- class(b)[-1] 
Error in class(b) <- class(b)[-1] : 
    invalid replacement object to be a class string 
2

Bạn có thể thử chức năng read.spss từ gói foreign.

Một cách thô và sẵn sàng để thoát khỏi lớp labelled tạo ra bởi spss.get

for (i in 1:ncol(x)) { 
    z<-class(x[[i]]) 
    if (z[[1]]=='labelled'){ 
     class(x[[i]])<-z[-1] 
     attr(x[[i]],'label')<-NULL 
    } 
} 

Nhưng bạn có thể xin vui lòng cho một ví dụ nơi labelled gây ra vấn đề?

Nếu tôi có một biến MAED trong một khung dữ liệu được tạo ra bởi xspss.get, tôi có:

> class(x$MAED) 
[1] "labelled" "factor" 
> is.factor(x$MAED) 
[1] TRUE 

Vì vậy, cũng như các văn bản mã mà hy vọng một yếu tố (nói) không nên có bất kỳ vấn đề.

+0

Trên thực tế, phương pháp này không loại bỏ lớp 'labelled'. Đây là lỗi: 'Lỗi trong lớp (x [[i]]) <- z [-1]: đối tượng thay thế không hợp lệ thành chuỗi lớp ' – aL3xa

+0

Nó hoạt động với tệp SPSS mà tôi đã thử. Bạn có thể xin vui lòng liên kết đến một tập tin mẫu mà điều này không thành công? Hoặc cung cấp cho đầu ra của cho (i in 1: ncol (x)) in (lớp (x [[i]]) trong đó x là khung dữ liệu đã nhập. –

+0

Bạn sẽ không thích thử 'sapply (x, class)' thay vì sử dụng vòng lặp? Oh, và, thật đáng buồn, tôi không thể nhớ lại tập tin dữ liệu nào tôi đang sử dụng ... Nó đã quá lâu rồi ... – aL3xa

0

Vâng, tôi đã tìm ra rằng unclass chức năng có thể được sử dụng để loại bỏ các lớp học (những người sẽ nói, aye ?!):

library(Hmisc) 
# let's presuppose that variable x is gathered through spss.get() function 
# and that x is factor 
> class(x) 
[1] "labelled" "factor" 
> foo <- unclass(x) 
> class(foo) 
[1] "integer" 

Nó không phải là giải pháp may mắn nhất, chỉ cần tưởng tượng back-chuyển đổi loạt các vectơ. .. Nếu bất cứ ai đứng đầu này, tôi sẽ kiểm tra nó như là một câu trả lời ...

0

Giả sử:

library(Hmisc) 
w <- spss.get('...') 

Bạn có thể loại bỏ các nhãn của một biến gọi là "var1" bằng cách sử dụng:

attributes(w$var1)$label <- NULL 

Nếu bạn cũng muốn loại bỏ lớp "labbled", bạn có thể làm:

class(w$var1) <- NULL 

hoặc nếu biến có nhiều hơn một lớp:

class(w$var1) <- class(w$var1)[-which(class(w$var1)=="labelled")] 

Hy vọng điều này sẽ hữu ích!

8

Dưới đây là cách tôi loại bỏ hoàn toàn các nhãn. Tương tự như giải pháp của Jyotirmoy nhưng làm việc cho một vector cũng như một data.frame. (Tín dụng một phần để Frank Harrell)

clear.labels <- function(x) { 
    if(is.list(x)) { 
    for(i in 1 : length(x)) class(x[[i]]) <- setdiff(class(x[[i]]), 'labelled') 
    for(i in 1 : length(x)) attr(x[[i]],"label") <- NULL 
    } 
    else { 
    class(x) <- setdiff(class(x), "labelled") 
    attr(x, "label") <- NULL 
    } 
    return(x) 
} 

Sử dụng như sau:

my.unlabelled.df <- clear.labels(my.labelled.df) 
Các vấn đề liên quan