通过在R和数字ir中的两个组内对列进行排序来排列数据帧

时间:2017-08-10 14:00:48

标签: r

我在R中有以下数据框,我想安排并生成序列列

.vue

我希望按bay row tier flag 43 11 88 NA 43 11 90 NA 43 11 86 NA 43 9 88 NA 43 9 92 NA 13 4 88 89 13 4 90 NA 13 4 94 NA 11 4 88 89 11 7 90 NA

按降序分组排列tier

数据框应该看起来像

bay and row

然后我想为这个排列的数据帧生成一个序列

bay   row     tier     flag
43     11      90       NA
43     11      88       NA
43     11      86       NA
43      9      92       NA
43      9      88       NA
13      4      94       NA
13      4      90       NA
13      4      88       89
11      7      90       NA
11      4      88       89

我在生成seq时要检查的唯一事情是 bay row tier flag seq 43 11 90 NA 1 43 11 88 NA 2 43 11 86 NA 3 43 9 92 NA 4 43 9 88 NA 5 13 4 94 NA 6 13 4 90 NA 7 13 4 88 89 8 11 7 90 NA 9 11 4 88 89 8 重复时我希望两行保持相同flag,否则sequence number值不同的数字

NA采用bay,row and tier格式

1 个答案:

答案 0 :(得分:2)

我们可以使用data.table。转换' data.frame'到' data.table' (setDT(df1)),order' bay',' row'和'等级'按降序排列,然后创建一个序列栏' seq',得到索引所在的标记'是重复的,不是NA,然后将i指定为逻辑索引,并按'标记'分组。我们改变了seq'到了' seq'

的第一个值
library(data.table)
df2 <- setDT(df1)[order(-bay, -row, -tier)][,  seq := seq_len(.N)]
i1 <- df2[, (duplicated(flag)|duplicated(flag, fromLast = TRUE)) & !is.na(flag)]
df2[i1, seq := seq[1L], .(flag)]
df2
#    bay row tier flag seq
# 1:  43  11   90   NA   1
# 2:  43  11   88   NA   2
# 3:  43  11   86   NA   3
# 4:  43   9   92   NA   4
# 5:  43   9   88   NA   5
# 6:  13   4   94   NA   6
# 7:  13   4   90   NA   7
# 8:  13   4   88   89   8
# 9:  11   7   90   NA   9
#10:  11   4   88   89   8