我有一个广泛的调查数据集。对于一个特定的问题,在原始数据中创建了一组变量来表示调查问题在特定月份被问到的不同事实。使用数据表对子集执行操作
我希望创建一个具有月份不变名称的新变量集合;这些变量的值将对应于所观察月份的月份变量问题的值。
请看一个例子/虚构数据集:
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”中的任何观察,“may.q1”被观察为“是”。我想要一个新的“Q1”变量来表示“may.q1”,“jun.q1”和“jul.q1”。当月份为“可”时,“Q1”的值将取“may.q1”的值,当月份为“jun”时,“Q1”的值将取值“jun.q1” 。
如果我尝试并使用数据表手工做到这一点,我想是这样的:
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 2013-04-22 18:56:58
MatthewDowle,这肯定比(我的)融合+演员快。我尝试了一个更大的数据。我不是在哪里接近...... 1e5 * 100列需要23秒,而这只需要不到一秒钟! – Arun 2013-04-22 19:56:38