2012-04-11 39 views
10

Tôi đang cố gắng xóa một số dữ liệu đã nhập sai. Câu hỏi cho biến cho phép nhiều câu trả lời trong năm lựa chọn, đánh số từ 1 đến 5. Dữ liệu đã được nhập theo cách sau (đây chỉ là một ví dụ - có nhiều biến hơn và nhiều quan sát hơn trong dữ liệu thực tế khung hình):Tách một cột dữ liệu được phân cách bằng dấu phẩy được phân cách bằng dấu phẩy và nhập lại thành các yếu tố

data 
      V1 
1 1, 2, 3 
2 1, 2, 4 
3 2, 3, 4, 5 
4 1, 3, 4 
5 1, 3, 5 
6 2, 3, 4, 5 

Dưới đây là một số mã để tái tạo rằng ví dụ dữ liệu:

data = data.frame(V1 = c("1, 2, 3", "1, 2, 4", "2, 3, 4, 5", 
         "1, 3, 4", "1, 3, 5", "2, 3, 4, 5")) 

những gì tôi thực sự cần là dữ liệu được xử lý thêm ... nhị phân - như một bộ "có/không có "câu hỏi - được nhập trong khung dữ liệu trông giống như:

data 
    V1.1 V1.2 V1.3 V1.4 V1.5 
1  1  1  1 NA NA 
2  1  1 NA  1 NA 
3  NA  1  1  1  1 
4  1 NA  1  1 NA 
5  1 NA  1 NA  1 
6  NA  1  1  1  1 

Tên biến thực sự không quan trọng tại thời điểm này - tôi có thể dễ dàng khắc phục điều đó. Ngoài ra, nó không quan trọng quá nhiều cho dù các yếu tố còn thiếu là "O", "NA", hoặc trống - một lần nữa, đó là một cái gì đó tôi có thể sửa chữa sau này.

Tôi đã thử sử dụng chức năng transform từ gói reshape cũng như nạp các thứ khác nhau với strsplit, nhưng tôi không thể làm được những gì tôi đang tìm kiếm. Tôi cũng đã xem xét nhiều câu hỏi liên quan khác trên Stackoverflow, nhưng chúng dường như không phải là vấn đề tương tự.

Trả lời

8

Bạn chỉ cần viết hàm và sử dụng apply. Đầu tiên một số dữ liệu giả:

##Make sure you're not using factors 
dd = data.frame(V1 = c("1, 2, 3", "1, 2, 4", "2, 3, 4, 5", 
         "1, 3, 4", "1, 3, 5", "2, 3, 4, 5"), 
        stringsAsFactors=FALSE) 

Tiếp theo, tạo một chức năng mà mất trong một hàng và biến đổi khi cần thiết

make_row = function(i, ncol=5) { 
    ##Could make the default NA if needed 
    m = numeric(ncol) 
    v = as.numeric(strsplit(i, ",")[[1]]) 
    m[v] = 1 
    return(m) 
} 

Sau đó sử dụng apply và transpose kết quả

t(apply(dd, 1, make_row)) 
+0

Dưới đây là một lớp lót để tự động xác định giá trị hợp lý của 'ncol' cho biến 'V1':' max (as.numeric (không công khai (strsplit (dd $ V1, "")))) ' (giả sử rằng câu trả lời cuối cùng trong nhiều câu trả lời được đưa ra dưới dạng câu trả lời ít nhất một lần) – BenBarnes

6

Một thời gian dài sau đó, cuối cùng tôi đã tạo ra một gói ("splitstackshape") đề cập đến loại dữ liệu này một cách hiệu quả. Vì vậy, để thuận tiện cho những người khác (và một số tự quảng bá, tất nhiên) đây là một giải pháp nhỏ gọn.

Chức năng liên quan cho vấn đề này là cSplit_e.

Thứ nhất, các thiết lập mặc định, mà vẫn giữ được cột gốc và sử dụng NA như điền:

library(splitstackshape) 
cSplit_e(data, "V1") 
#   V1 V1_1 V1_2 V1_3 V1_4 V1_5 
# 1 1, 2, 3 1 1 1 NA NA 
# 2 1, 2, 4 1 1 NA 1 NA 
# 3 2, 3, 4, 5 NA 1 1 1 1 
# 4 1, 3, 4 1 NA 1 1 NA 
# 5 1, 3, 5 1 NA 1 NA 1 
# 6 2, 3, 4, 5 NA 1 1 1 1 

Thứ hai, với thả các cột gốc và sử dụng 0 như điền.

cSplit_e(data, "V1", drop = TRUE, fill = 0) 
# V1_1 V1_2 V1_3 V1_4 V1_5 
# 1 1 1 1 0 0 
# 2 1 1 0 1 0 
# 3 0 1 1 1 1 
# 4 1 0 1 1 0 
# 5 1 0 1 0 1 
# 6 0 1 1 1 1 
Các vấn đề liên quan