【问题标题】:How to assign index while ignoring NAs by group如何在按组忽略 NA 的同时分配索引
【发布时间】:2017-03-09 19:09:33
【问题描述】:

给定以下data.table

library(data.table)
dt <- data.table(id=c(1,2,3,4), Year1=c(NA, 30, 40, NA), Year2=c(NA, 30, 20 ,70), Year3=c(60, 40, 0, 10), Year4=c(10,20,30,30)) 
dtm <- melt(dt, id.var = 'id')[order(id, variable)]

我想将索引分配给dtm,这样预期的回报如下:

   id variable value index
 1:  1    Year1    NA    NA
 2:  1    Year2    NA    NA
 3:  1    Year3    60     1
 4:  1    Year4    10     2
 5:  2    Year1    30     1
 6:  2    Year2    30     2
 7:  2    Year3    40     3
 8:  2    Year4    20     4
 9:  3    Year1    40     1
10:  3    Year2    20     2
11:  3    Year3     0     3
12:  3    Year4    30     4
13:  4    Year1    NA    NA
14:  4    Year2    70     1
15:  4    Year3    10     2
16:  4    Year4    30     3

我试过dtm[ ,index:=1:.N, by = id],但它并没有忽略NA。

你能给我建议吗?

【问题讨论】:

    标签: r data.table na


    【解决方案1】:

    我们需要指定 'i' 来忽略 NAs

    dtm[!is.na(value), index := 1:.N , by = id]
    dtm
    #    id variable value index
    # 1:  1    Year1    NA    NA
    # 2:  1    Year2    NA    NA
    # 3:  1    Year3    60     1
    # 4:  1    Year4    10     2
    # 5:  2    Year1    30     1
    # 6:  2    Year2    30     2
    # 7:  2    Year3    40     3
    # 8:  2    Year4    20     4
    # 9:  3    Year1    40     1
    #10:  3    Year2    20     2
    #11:  3    Year3     0     3
    #12:  3    Year4    30     4
    #13:  4    Year1    NA    NA
    #14:  4    Year2    70     1
    #15:  4    Year3    10     2
    #16:  4    Year4    30     3
    

    或者如果我们使用的是开发版本(来自@Frank 的 cmets)

    dtm[!is.na(value), z := rowid(id)]
    

    【讨论】:

    • 或者,在 1.9.7 或更高版本中:dtm[!is.na(value), z := rowid(id)]
    • @akrun 我试图从0开始索引,将index:=1:.N替换为index:=0:.N,它返回以下警告Warning messages: 1: In [.data.table(dtm, !is.na(value), :=@ 987654328@ 所以,我改用dtm[!is.na(value, index:=(1L:.N)-1L, by = id],它工作正常。我不确定是什么创建了警告消息。
    • @newbie 你的例子我没有收到任何警告
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    相关资源
    最近更新 更多