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 <- subset(mydata,Unit if QTR=4~Score > QTR=1~Score)

感谢您的时间

4

3 回答 3

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
于 2013-01-16T02:31:07.360 回答
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
于 2013-01-16T09:11:06.520 回答
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
于 2013-01-16T02:37:27.143 回答