我有以下数据,我想扩展它。例如,如果June有两次成功,一次失败,我的数据集应如下所示:
month | is_success
------------------
6 | T
6 | T
6 | F
数据集如下:
# Months from July to December
months <- 7:12
# Number of success (failures) for each month
successes <- c(11,22,12,7,6,13)
failures <- c(20,19,11,16,13,10)
示例解决方案如下:
dataset<-data.frame()
for (i in 1:length(months)) {
dataset <- rbind(dataset,cbind(rep(months[i], successes[i]), rep(T, successes[i])))
dataset <- rbind(dataset,cbind(rep(months[i], failures[i]), rep(F, failures[i])))
}
names(dataset) <- c("months", "is_success")
dataset[,"is_success"] <- as.factor(dataset[,"is_success"])
问题:重写此代码有哪些不同的方法?
我正在寻找一种全面的解决方案,采用不同但有效的方式(矩阵,循环,应用)。
谢谢!
答案 0 :(得分:1)
这是rep
的一种方式。基于复制1和0创建一个包含'months'和'is_success'的数据集。然后根据需要复制行'successcesses','failures',order
,并将行名称设置为'NULL “
d1 <- data.frame(months, is_success = factor(rep(c(1, 0), each = length(months))))
d2 <- d1[rep(1:nrow(d1), c(successes, failures)),]
d2 <- d2[order(d2$months),]
row.names(d2) <- NULL
现在,我们检查这是否等于从for
循环
all.equal(d2, dataset, check.attributes = FALSE)
#[1] TRUE
或者@thelatemail建议,'d1'可以使用expand.grid
d1 <- expand.grid(month=months, is_success=1:0)
答案 1 :(得分:1)
使用mapply
你可以试试这个:
createdf<-function(month,successes,failures){
data.frame(month=rep(x = month,(successes+failures)),
is_success=c(rep(x = T,successes),
rep(x = F,failures))
)
}
现在创建一个必需的data.frames
列表:
lofdf<-mapply(FUN = createdf,months,successes,failures,SIMPLIFY = F)
然后使用plyr
包的ldply
函数进行组合:
resdf<-ldply(lofdf,.fun = data.frame)