获取数据表(R)中每行的最后1的索引

时间:2012-08-13 21:16:04

标签: r data.table

我目前正在尝试习惯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函数的情况下执行此操作?

1 个答案:

答案 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