我想创建一个数据子集,其中包含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,单位,如果QTR = 4~分数> QTR = 1~分数)
感谢您的时间
答案 0 :(得分: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
答案 1 :(得分: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 :(得分:2)
使用data.table
的解决方案(可能有比我现在更好的版本)。
注意:假设给定QTR
的{{1}}值是唯一的
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: