从R

时间:2016-06-07 17:38:37

标签: r

我有以下数据框架,我试图准备运行逻辑回归,转而使用'总计'和'是'计入二进制,其中yes = yes和no = total-yes。这是原作:

year<-1999:2012
total<-c(4372, 6448, 6141, 5630, 6588, 7878, 7768, 7352, 6333, 5168, 4569, 4152, 3540, 1412)
yes<-c(400, 580, 609, 567, 606, 843, 853, 839, 825, 607, 510, 459, 476, 209)
mdr<-data.frame(year, total, yes)

我想要一个longform表设置二进制是/否,以年为线性变量;即两列:数据$ year,重复&#39; total&#39;时间和数据$ mdr,这是&#39; Y&#39;重复“是”&#39;每年的时间和N&#39;在给定年份中发生的重复总次数。直觉上,我知道这里的语法很糟糕:

newdf<- 

for 1:i in mdr

newdf$year<-rep(year, 'total' times)
newdf$mdr<-rep(c('Y','N') times = c(yes, total-yes)

预期产出:

Year    MDR
1999     Y
1999     Y
1999     Y
1999     Y

但是1999年有400个Y和4372-400个,2000年有580个Y和6448-580个N等。

有人可以帮助我把它变成一个工作循环或者一个或者类似的吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

我认为这应该可以产生这样的data.frame:

repVec <- c(t(cbind(mdr$yes, mdr$total-mdr$yes)))
df <- with(mdr, data.frame("year"=rep(year, total), 
                           "mdr"=rep(rep(c("y", "n"), nrow(mdr)), repVec)))

第一行创建的矢量具有适当数量的是和每年没有。

data.frame函数创建一个data.frame,使用rep重复适当的年份。 mdr变量由两个rep函数构成,第一个按原始data.frame中的行数重复c(&#34; y&#34;,&#34; n&#34;)。然后将该载体送入第二个rep函数,该函数以repVec指示的次数重复该向量的每个元素。