R - 在data.table中查找第一个非零元素的索引

时间:2014-11-23 18:11:25

标签: r data.table

我以下列形式获得了pannel数据:

DT = data.table(Id=1:5, Time1=c(0,0,1,2,0), Time2=c(1,0,0,0,0), Time3=c(0,1,2,0,0), Time4=c(0,1,2,5,4))

Id  Time1 Time2 Time3 Time4
1   0     1     0     0
2   0     0     1     1
3   1     0     2     2
4   2     0     0     5
5   0     0     0     4

我想第一次为每个非0的ID提取。 数据集很大,因此我一直在寻找具有data.table的解决方案。

我尝试使用哪个.min(其中!= 0),但可以解决它。

输出应如下所示:

Id  Time1 Time2 Time3 Time4 Output
1   0     1     0     0     2
2   0     0     1     1     3
3   1     0     2     2     1
4   2     0     0     5     1
5   0     0     0     4     4

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

你可以做到

DT[, Output := which.max(.SD != 0), by = Id][]
#    Id Time1 Time2 Time3 Time4 Output
# 1:  1     0     1     0     0      2
# 2:  2     0     0     1     1      3
# 3:  3     1     0     2     2      1
# 4:  4     2     0     0     5      1
# 5:  5     0     0     0     4      4

which.max找到第一次出现的最大值的索引。因此,当我们.SD != 0时,它会找到第一次出现的TRUE

同样,我们也可以使用

DT[, Output := match(TRUE, .SD != 0), by = Id]
# or 
DT[, Output := which(.SD != 0)[1], by = Id]