Tôi có một bộ dữ liệu khảo sát ở dạng rộng. Đối với một câu hỏi cụ thể, một tập hợp các biến được tạo ra trong dữ liệu thô để đại diện cho sự thật là câu hỏi khảo sát được hỏi vào một tháng cụ thể.Thực hiện các thao tác trên một tập con bằng cách sử dụng bảng dữ liệu
Tôi muốn tạo một tập hợp các biến mới có tên bất biến tháng; giá trị của các biến này sẽ tương ứng với giá trị của câu hỏi biến thể tháng cho tháng được quan sát.
Hãy xem một ví dụ/hư cấu bộ dữ liệu:
require(data.table)
data <- data.table(month = rep(c('may', 'jun', 'jul'), each = 5),
may.q1 = rep(c('yes', 'no', 'yes'), each = 5),
jun.q1 = rep(c('breakfast', 'lunch', 'dinner'), each = 5),
jul.q1 = rep(c('oranges', 'apples', 'oranges'), each = 5),
may.q2 = rep(c('econ', 'math', 'science'), each = 5),
jun.q2 = rep(c('sunny', 'foggy', 'cloudy'), each = 5),
jul.q2 = rep(c('no rain', 'light mist', 'heavy rain'), each = 5))
Trong cuộc khảo sát này, có thực sự chỉ có hai câu hỏi: "q1" và "q2". Mỗi câu hỏi này được hỏi nhiều lần trong vài tháng. Tuy nhiên, quan sát chỉ chứa phản hồi hợp lệ khi tháng được quan sát trong dữ liệu khớp với câu hỏi khảo sát cho một tháng cụ thể.
Ví dụ: "may.q1" được quan sát là "có" cho bất kỳ quan sát nào trong "Có thể". Tôi muốn biến "Q1" mới đại diện cho "may.q1", "jun.q1" và "jul.q1". Giá trị của "Q1" sẽ tính theo giá trị "may.q1" khi tháng "có thể" và giá trị "Q1" sẽ tính theo giá trị "jun.q1" khi tháng là "jun" .
Nếu tôi là để thử và làm điều này bằng tay sử dụng bảng dữ liệu, tôi muốn một cái gì đó như:
mdata <- data[month == 'may', c('month', 'may.q1', 'may.q2'), with = F]
setnames(mdata, names(mdata), gsub('may\\.', '', names(mdata)))
Tôi muốn điều này lặp đi lặp lại "bởi = tháng".
Nếu tôi được sử dụng "plyr" trọn gói cho một khung dữ liệu, tôi sẽ giải quyết bằng cách sử dụng phương pháp sau đây:
require(plyr)
data <- data.frame(data)
mdata <- ddply(data, .(month), function(dfmo) {
dfmo <- dfmo[, c(1, grep(dfmo$month[1], names(dfmo)))]
names(dfmo) <- gsub(paste0(dfmo$month[1], '\\.'), '', names(dfmo))
return(dfmo)
})
Bất kỳ sự giúp đỡ sử dụng một phương pháp data.table sẽ được đánh giá rất nhiều, như dữ liệu của tôi lớn. Cảm ơn bạn.
Oh wow .. Tôi dint nghĩ về điều này! tuyệt vời. – Arun
MatthewDowle, đây là * chắc chắn * nhanh hơn (của tôi) tan chảy + cast. Tôi đã thử nó trên một dữ liệu lớn hơn. Tôi không có nơi nào gần ... Phải mất 23 giây trên một cột 1e5 * 100 trong khi điều này thực hiện nó trong chưa đầy một giây! – Arun