这是我的数据样本:

kod <- structure(list(ID_WORKES = c(28029571L, 28029571L, 28029571L,
28029571L, 28029571L, 28029571L, 28029571L, 28029571L, 28029571L
), TABL_NOM = c(9716L, 9716L, 9716L, 9716L, 9716L, 9716L, 9716L,
9716L, 9716L), NAME = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L), .Label = "Dim", class = "factor"), ID_SP_NAR = c(20L,
20L, 20L, 30L, 30L, 30L, 30L, 30L, 30L), KOD_DOR = c(28L, 28L,
28L, 28L, 28L, 28L, 28L, 28L, 28L), KOD_DEPO = c(9167L, 9167L,
9167L, 9167L, 9167L, 9167L, 9167L, 9167L, 9167L), COLUMN_MASH = c(13L,
13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L), prop_violations = c(0.00561797752808989,
0.00293255131964809, 0.00495049504950495, 0.00215982721382289,
0.0120481927710843, 0.00561797752808989, 0.00293255131964809,
0.00591715976331361, 0.00495049504950495), mash_score = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), row.names = c(NA, -9L), class = "data.frame")
W


我要实现的帽子如下:

对于由列ID_WORKESTABL_NOMNAMEKOD_DORKOD_DEPO组成的每个组,我希望在ID_SP_NAR中具有唯一的值。

例如,这里有六行,其中ID_SP_NAR == 30prop_violations值不同。
在这种情况下,我想对这六行进行汇总,以使prop_violations的剩余值等于这六行的平均值。

所需的输出如下所示:

  ID_WORKES TABL_NOM NAME KOD_DOR KOD_DEPO ID_SP_NAR prop_violations mash_score
1  28029571     9716  Dim      28     9167        20     0.004500341          0
2  28029571     9716  Dim      28     9167        30     0.005604367          0


但是还有另一件事:如果对于prop_violations中ID_SP_NAR的某些重复值,mash_ score的值> 0,则保留mash_score的值> 0的最后一个值

例如。

  ID_WORKES TABL_NOM NAME ID_SP_NAR KOD_DOR KOD_DEPO COLUMN_MASH prop_violations mash_score
1  28029571     9716  Dim        30      28     9167          13          0,0056          0
2  28029571     9716  Dim        30      28     9167          13     0,012048193          0
3  28029571     9716  Dim        30      28     9167          13     0,005617978          0
4  28029571     9716  Dim        30      28     9167          13     0,002932551          1
5  28029571     9716  Dim        30      28     9167          13      0,00591716          0
6  28029571     9716  Dim        30      28     9167          13     0,004950495          0


在这种情况下,通过prop_violation将ID_SP_NAR = 30保留为仅值0,002932551,因为mash_score> 0
如何达到这个条件?

最佳答案

使用data.table的选项:

setDT(kod)
kod[, {
        if(any(mash_score)>0) {
            i <- which(mash_score>0)[1L]
            .(prop_violations=prop_violations[i], mash_score=mash_score[i])
        } else
            .(prop_violations=mean(prop_violations), mash_score=mash_score[1L])
    },
    .(ID_WORKES, TABL_NOM, NAME, KOD_DOR, KOD_DEPO, ID_SP_NAR)]


输出:

   ID_WORKES TABL_NOM NAME KOD_DOR KOD_DEPO ID_SP_NAR prop_violations mash_score
1:  28029571     9716  Dim      28     9167        20     0.004500341          0
2:  28029571     9716  Dim      28     9167        30     0.002932551          1


数据:

kod <- structure(list(ID_WORKES = c(28029571L, 28029571L, 28029571L,
    28029571L, 28029571L, 28029571L, 28029571L, 28029571L, 28029571L
), TABL_NOM = c(9716L, 9716L, 9716L, 9716L, 9716L, 9716L, 9716L,
    9716L, 9716L), NAME = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L,
        1L, 1L), .Label = "Dim", class = "factor"), ID_SP_NAR = c(20L,
            20L, 20L, 30L, 30L, 30L, 30L, 30L, 30L), KOD_DOR = c(28L, 28L,
                28L, 28L, 28L, 28L, 28L, 28L, 28L), KOD_DEPO = c(9167L, 9167L,
                    9167L, 9167L, 9167L, 9167L, 9167L, 9167L, 9167L), COLUMN_MASH = c(13L,
                        13L, 13L, 13L, 13L, 13L, 13L, 13L, 13L), prop_violations = c(0.00561797752808989,
                            0.00293255131964809, 0.00495049504950495, 0.00215982721382289,
                            0.0120481927710843, 0.00561797752808989, 0.00293255131964809,
                            0.00591715976331361, 0.00495049504950495), mash_score = c(0L,
                                0L, 0L, 0L, 0L, 0L, 1L, 0L, 0L)), row.names = c(NA, -9L), class = "data.frame")

08-19 20:31