У меня есть набор данных опроса в широкой форме. Для конкретного вопроса в исходных данных был создан набор переменных, чтобы различать тот факт, что вопрос об исследовании был задан в конкретный месяц.Выполнение операций по подмножеству с использованием таблицы данных
Я хочу создать новый набор переменных, имеющих месячно-инвариантные имена; значение этих переменных будет соответствовать значению месячного варианта вопроса за наблюдаемый месяц.
Пожалуйста, смотрите пример/фиктивный набор данных:
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))
В этом обзоре, на самом деле есть только два вопроса: "q1" и "q2". Каждый из этих вопросов неоднократно запрашивался в течение нескольких месяцев. Однако наблюдение содержит действительный ответ только в том случае, если месяц, наблюдаемый в данных, совпадает с вопросом опроса в течение определенного месяца.
Например: «may.q1» наблюдается как «да» для любого наблюдения в «мае». Я бы хотел, чтобы новая переменная «Q1» представляла «may.q1», «jun.q1» и «jul.q1». Значение «Q1» будет принимать значение «may.q1», если месяц «может», а значение «Q1» примет значение «jun.q1», когда месяц «jun», ,
Если бы я, чтобы попытаться сделать это вручную, используя данные таблицы, я хотел бы что-то вроде:
mdata <- data[month == 'may', c('month', 'may.q1', 'may.q2'), with = F]
setnames(mdata, names(mdata), gsub('may\\.', '', names(mdata)))
Я хочу это повторил «по = месяц».
Если бы я должен был использовать пакет «plyr» для кадра данных, я бы решить, используя следующий подход:
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)
})
Любая помощь с использованием метода data.table бы весьма признателен, поскольку мои данные большие. Спасибо.
Ого .. я вмятину думать об этом! здорово. – Arun
MatthewDowle, это * определенно * быстрее, чем (мой) расплав + литье. Я попробовал его по более крупным данным. Мина не там, где близко ... Это займет 23 секунды на столбцах 1e5 * 100, тогда как это происходит менее чем за секунду! – Arun