扩展R数据的不同方法

时间:2017-07-20 04:29:23

标签: r

我有以下数据,我想扩展它。例如,如果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"])

问题:重写此代码有哪些不同的方法?

我正在寻找一种全面的解决方案,采用不同但有效的方式(矩阵,循环,应用)。

谢谢!

2 个答案:

答案 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)