我目前正在尝试习惯data.table
中的R
个包。我想获取数据表每行中最后1
个标记的索引,例如a
,并将该新列添加到a
。我的代码如下:
a = data.table(matrix(sample(c(0,1),500,rep=T),50,10))
a[,ind:=apply(a==1,1,function(x) max(which(x)))]
尽管如此,我认为这可以使用更多data.table
语法以简短的方式编写。因此,我的问题是:如何在apply
的{{1}}组件中没有j
函数的情况下执行此操作?
答案 0 :(得分:3)
好问题。是的,apply
by row不是页面效率,which
将为每一行分配,a==1
创建一个与{{1}一样大的新逻辑矩阵}。
在a
我们按列进行操作。 有时候,它是data.table
- 在列中使用data.table
循环(从不for
循环遍历行):
for
正如您所看到的,它是一种完全不同的风格。但是,我认为,这应该是:
a[,ans:=0L]
for (i in 1:10) set(a,which(a[[i]]==1),"ans",i)
identical(a$ind, a$ans)
# [1] TRUE
a
(非原始的矢量化函数)which()
而不是10
次请参阅nrow(a)
。
在回复评论时,要检查其工作原理,?set
碰巧会返回指向set
的指针,因此我们可以查看前几行的进展情况。
data.table
现在希望以下内容揭示它是如何运作的:
a[,ans:=0L] # add column by reference, initialized with 0L
> head(a)
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 ans
1: 0 0 1 0 1 1 0 1 1 1 0
2: 0 0 1 1 0 0 1 1 1 1 0
3: 0 1 0 0 0 1 1 1 1 0 0
4: 0 0 0 1 1 0 1 1 1 1 0
5: 1 1 1 1 0 0 0 0 0 1 0
6: 1 1 0 1 1 0 1 0 1 1 0