我在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级时停止计算。
感谢帮助!
答案 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