2013-01-16 28 views
1

我想創建由QTR 4中的分數高於QTR 1(上升趨勢)的單位組成的數據的子集。如果存在QTR 2或3,則無關緊要。具有兩列標準的數據子集

Unit QTR Score 
5  4  34 
1  1  22 
5  3  67 
2  4  78 
3  2  39 
5  2  34 
1  2  34 
5  1  67 
1  3  70 
1  4  89 
3  4  19 

子集將是:

Unit QTR Score 
1  1  22 
1  2  34 
1  3  70 
1  4  89 

我試過的是這樣的變體: upward_subset < - 子集(MYDATA,單位如果QTR = 4〜得分> QTR = 1〜得分)

謝謝您的時間

+0

有的單位錯過了四分之一。每個單元出現一次:單元25只能在QTR 1,QTR 2,QTR 3和QTR 4中完成一次審計。 – KLDavenport

回答

3

如果數據框被命名爲「d」,那麼這種成功在您的測試設置:

d[ which(d$Unit %in% 
    (sapply(split(d, d["Unit"]), 
     function(dd) dd[dd$QTR ==4, "Score"] - dd[dd$QTR ==1, "Score"]) > 0)) , 
    ] 
#------------- 
    Unit QTR Score 
2  1 1 22 
7  1 2 34 
9  1 3 70 
10 1 4 89 
2

兩個步驟的選擇:

result <- unlist(
       by(
       test, 
       test$Unit, 
       function(x) x$Score[x$QTR==4] > x$Score[x$QTR==2]) 
       ) 

test[test$Unit %in% names(result[result==TRUE]),] 

    Unit QTR Score 
2  1 1 22 
7  1 2 34 
9  1 3 70 
10 1 4 89 
2

使用data.table(也許還有更好的版本比我目前所面對的)一個解決方案。

注:假設一個QTR值對於給定Unit是唯一

Data:

df <- structure(list(Unit = c(5L, 1L, 5L, 2L, 3L, 5L, 1L, 5L, 1L, 1L, 
     3L), QTR = c(4L, 1L, 3L, 4L, 2L, 2L, 2L, 1L, 3L, 4L, 4L), Score = c(34L, 
     22L, 67L, 78L, 39L, 34L, 34L, 67L, 70L, 89L, 19L)), .Names = c("Unit", 
     "QTR", "Score"), class = "data.frame", row.names = c(NA, -11L 
    )) 

Solution:

dt <- data.table(df, key=c("Unit", "QTR")) 
dt[, Score[Score[QTR == 4] > Score[QTR == 1]], by=Unit] 

    Unit V1 
1: 1 22 
2: 1 34 
3: 1 70 
4: 1 89 
+0

有趣我從來沒有聽說過data.table庫。它允許我創建一個表dtlast < - dt [,Score [Score [QTR == 4]> Score [QTR == 1]],by = Unit]我的目標是能夠通過這個顏色爲ggplot2視覺着色屬性所以我認爲它會起作用。 – KLDavenport

相關問題