2016-06-20 28 views
0

我在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的列表,他們有多個計數,直到他們的測試分數達到65.這會告訴我,此數據框中66%的客戶在獲得及格分數之前需要多個測試會話。

下面是我的想法或概念或多或少,我if語句 如果ID出現兩次 計數它出現的頻率,直到TEST GRADE誣陷它作爲一個> = 65

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

我m在我想說的第二部分中掙扎,計數ID的發生直到等級> = 65。

我看到的其他選項是某種循環。下面是我嘗試

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

同樣的鬥爭進來如何讓R停車時命中等級65

感謝幫助計數!

回答

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

下面是使用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) 

數據

df <- read.table(header=T, text="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") 
+0

我已經試過這種方式,我得到了以下錯誤:錯誤的GET(as.character(FUN),模式=「功能」,ENVIR = envir): 未找到模式'function'的對象'FUN'。任何想法可能是什麼? – LoF10

+0

你在使用什麼類型的對象?一個data.frame或一個data.table?這個方法適用於上面的例子。我將添加我用於回答的數據。 – lmo

+0

我正在使用數據框。該ID被編碼爲數字,並且等級也是數字。我試着改變ID來看看我有沒有效果,但沒有骰子。感謝您的幫助。 – LoF10

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