r中显式行的行号

时间:2015-08-19 08:56:12

标签: r dataframe dplyr row-number

我需要获取在id上分组的显式行的行号。我们说dataframe(df)看起来像这样:

 id  a   b 
 3   2   NA
 3   3   2
 3   10  NA
 3   21  0
 3   2   NA
 4   1   5
 4   1   0
 4   5   NA

我需要再创建一个列,它会给出行号序列,不​​包括b == 0的情况。

期望的输出:

 id  a   b   row
 3   2   NA   1
 3   3   2    2
 3   10  NA   3
 3   21  0    -
 3   2   NA   4
 4   1   5    1
 4   1   0    -
 4   5   NA   2

我使用了dplyr但却无法达到同样的效果, 我的代码:

df <- df %>%
       group_by(id) %>%
       mutate(row = row_number(id[b != 0]))

请建议一些更好的方法来做到这一点。

1 个答案:

答案 0 :(得分:7)

我建议使用data.table软件包,以便在子集上运行时具有良好的功能,从而避免低效率的操作,例如ifelse或评估整个数据集。此外,最好将矢量保持在数字类中(以便将来的操作),因此NA可能比-(字符)更可取,这里有一个可能的解决方案

library(data.table)
setDT(df)[is.na(b) | b != 0, row := seq_len(.N), by = id]
#    id  a  b row
# 1:  3  2 NA   1
# 2:  3  3  2   2
# 3:  3 10 NA   3
# 4:  3 21  0  NA
# 5:  3  2 NA   4
# 6:  4  1  5   1
# 7:  4  1  0  NA
# 8:  4  5 NA   2

此处的想法是仅对is.na(b) | b != 0行进行操作,并在更新.N 的同时生成每个组大小(row)的序列 (使用:=)。默认情况下,所有其余行都将分配NA个。