首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的测度保留

R中的测度保留
EN

Stack Overflow用户
提问于 2014-04-19 19:20:17
回答 1查看 1K关注 0票数 3

我有一个数据集,其中包含以下列格式注册的课外课程学生的信息:

代码语言:javascript
复制
student_id  year group number
1   2009-10 1
2   2009-10 1
3   2009-10 2
4   2009-10 3
5   2009-10 3
1   2010-11 1
2   2010-11 2
3   2010-11 3
4   2010-11 2
5   2010-11 2

我想衡量每一组的留用量,每年一次.我需要编写某种循环语句,它将回顾前一年,计算每个组的类似I的值,并返回一个值除以该组中的总数。我已经勾勒出了代码(这可能是低效的/遗漏了一些步骤),如下所示?

代码语言:javascript
复制
for (i in levels(data$year)){
  if (i=="2009-10"){
    #no previous year to look for
    next
  }else{
    for(g in levels(data$group)){

    ##perhaps a plyr summarize function?

    #look for id in previous year for that group
    #compute count of identical ids
    #return value/length(group)
    }
  }

在阅读了一些建议之后,也许使用ddply(transform)函数会更简单一些。是否有办法在年份和组号之间建立关联关系?代码应该如下所示:

代码语言:javascript
复制
tracking=ddply(data,"student_id", transform, enroll.year1=1, enroll.year2=ifelse(criteria goes here,1,0), enroll.year3=ifelse(criteria goes here,1,0)

一些示例输出可能如下所示:

代码语言:javascript
复制
Year    Group   retention rate

2010-11 1   0.88
2011-12 1   0.8

2010-11 2   0.5
2011-12 2   0.6

2010-11 3   0.5
2011-12 3   0.5

以前有没有人解决过类似的留置问题?我很难概念化这些步骤,更不用说在R中实现任何帮助了。*

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-19 21:16:56

我能想到的解决方案之一是一年内自动换班。为了简单地加入和分组,我将使用data.table。为了方便起见,我还将更改一些名称和年份格式。我已经将您的数据保存在一个名为data.framedd

代码语言:javascript
复制
names(dd) <- c('id', 'year', 'group')
dd$year <- as.integer(substr(dd$year, 1, 4))

dd.prev <- dd
dd.prev$year <- dd.prev$year + 1   ## shifting year upwards so it matches the next year

require(data.table)
dd <- data.table(dd)
setkey(dd, group, year)

dd.prev <- data.table(dd.prev)
setkey(dd.prev, group, year)
setnames(dd.prev, 'id', 'id.prev')  ## changing variable name so it is distinct

extra.year <- max(dd$year) + 1  ## the shift generates an extra year
dd.prev <- dd.prev[!year==extra.year]  ## drop extra year as retention not defined

dd <- dd[dd.prev]   ## join data from previous year to current data

dd.all[, retention:=as.numeric(length(intersect(id, id.prev)) 
                               /length(unique(id.prev))), 
       by=list(year, id)]

最后一点计算保留率,如您所定义的:从去年至今的学生人数,intersect(id, id.prev),除以去年的学生总数,unique(id.prev)。有了这些数据,它只生成2010年的留存额,但使用较长的系列,它将生成除第一年以外的所有年份的数据。

更新1:使用plyr

代码语言:javascript
复制
names(dd) <- c('id', 'year', 'group')
dd$year <- as.integer(substr(dd$year, 1, 4))

dd.prev <- dd
dd.prev$year <- dd.prev$year + 1   ## shifting year upwards so it matches the next year
names(dd.prev)[1] <- 'id.prev'  ## changing variable name so it is distinct

extra.year <- max(dd$year) + 1  ## the shift generates an extra year
dd.prev <- dd.prev[dd.prev$year!=extra.year,]  ## drop extra year

dd <- merge(dd, dd.prev, all.y=TRUE)   ## join data from previous year to current data



require(plyr)
dd <- ddply(dd, .(group, year), summarize, 
             retention=length(intersect(id, id.prev)) 
                        /length(unique(id.prev)))

我希望这能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23174407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档