我有一个宽格式的调查数据集。针对一个特定问题,在原始数据中创建了一组变量,以表示在特定月份问卷调查问题的不同事实。
我希望创建一组新的变量,具有与月份无关的名称;这些变量的值将对应于观察到的月份的月份变量问题的值。
请参见以下示例/虚构数据集:
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”。每个问题会在几个月内反复提问。然而,只有当数据中观察到的月份与特定月份的调查问题相匹配时,才包含有效响应。
例如:“5月.q1”对于任何“5月”的观察都被观察为“是”。我想要一个新的“Q1”变量来代表“5月.q1”,“6月.q1”和“7月.q1”。当月份为“5月”时,“Q1”的值将取“5月.q1”的值;当月份为“6月”时,“Q1”的值将取“6月.q1”的值。
如果我想手动使用数据表来实现这一点,我希望得到类似以下的内容:
mdata <- data[month == 'may', c('month', 'may.q1', 'may.q2'), with = F]
setnames(mdata, names(mdata), gsub('may\\.', '', names(mdata)))
我希望将“by = month”重复。
如果我要为数据框使用“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方法的帮助都将不胜感激,因为我的数据很大。谢谢。