计算R

时间:2016-06-20 19:40:10

标签: r

我在R和学习方面相对较新。我有以下数据框=数据

 ID   grade   Test_Date
  1     56      01-25-2012
  1     63      02-21-2016
  1     73      02-31-2016
  2     41      12-23-2015
  2     76      01-07-2016
  3     66      02-08-2016

我希望计算多次尝试后通过测试的人数(在这种情况下只有两个独特的个体)(传递被定义为65或更高)。因此,最终产品将返回一个唯一ID的列表,这些ID具有多个计数,直到他们的测试分数达到65.这将告诉我大约。此数据框中66%的客户在获得及格分数之前需要多次测试。

以下是我的想法或概念或多或少,我将其框架为if语句 如果ID出现两次 计算出现的频率,直到TEST GRADE> = 65

                ifelse(duplicated(data$ID), count(ID), NA)

我在第二篇文章中苦苦挣扎,想要说出ID,直到成绩> = 65。

我看到的另一个选择是某种循环。以下是我的尝试

             for (i in data$ID) {
                  duplicated(datad$ID)
                  count(data$ID)
                  Here is where something would say until =65
                  }

再次斗争就是如何告诉R在成绩达到65级时停止计算。

感谢帮助!

3 个答案:

答案 0 :(得分:2)

您可以使用data.table

library(data.table)

dt <- fread(" ID   grade   Test_Date
  1     56      01-25-2012
                    1     63      02-21-2016
                    1     73      02-31-2016
                    2     41      12-23-2015
                    2     76      01-07-2016
                    3     66      02-08-2016")

# count the number of try per ID then get only the one that have been successful
dt <- dt[, N:=.N, by=ID][grade>=65]

# proportion of successful having tried more than once
length(dt[N>1]$ID)/length(dt$ID)
[1] 0.6666667

答案 1 :(得分:1)

这是一个使用.combine/.multicombine函数和子集的方法,它返回从第二次测试开始多次参加测试的测试人员的最高分数。

aggregate

要获取行数,您可以使用multiTestMax <- aggregate(grade~ID, data=df[duplicated(df$ID),], FUN=max) multiTestMax ID grade 1 1 73 2 2 76

nrow

或所有考生的比例

nrow(multiTestMax)
2

数据

  nrow(multiTestMax) / unique(df$ID)

答案 2 :(得分:0)

另一个选择,虽然其他两个工作正常:

library(dplyr)
dat2 <- dat %>%
    group_by(ID) %>%
    summarize(
        multiattempts = n() > 1 & any(grade < 65),
        maxgrade = max(grade)
    )
dat2
# Source: local data frame [3 x 3]
#      ID multiattempts maxgrade
#   <int>         <lgl>    <int>
# 1     1          TRUE       73
# 2     2          TRUE       76
# 3     3         FALSE       66
sum(dat2$multiattempts) / nrow(dat2)
# [1] 0.6666667