确定data.frame的列何时更改值并返回更改的索引

Nik*_*kos 11 r duplicates dataframe data.table

我试图找到一种方法来确定一组列何时更改data.frame中的值.让我直截了当,请考虑以下示例:

x<-data.frame(cnt=1:10, code=rep('ELEMENT 1',10), val0=rep(5,10), val1=rep(6,10),val2=rep(3,10))
x[4,]$val0=6
Run Code Online (Sandbox Code Playgroud)
  • cnt列是一个唯一的ID(可以是日期或时间列,为简单起见,这里是一个int)
  • 代码列就像行集的代码(想象几个这样的组,但具有不同的代码).代码和cnt是我的data.table中的键.
  • val0,val1,val2列就像得分一样.

上面的data.frame应该读作:'ELEMENT 1'的分数从5,6,3开始,一直保持到4迭代时它们变为6,6,3,然后再变回5,6 ,3.

我的问题是,有没有办法获得data.frame的第1,第4和第5行?有没有办法检测列何时发生变化?(有12列btw)

我尝试使用重复的data.table(在大多数情况下完美地工作)但在这种情况下它将删除所有重复项并仅保留第1行和第4行(删除第5行).

你有什么建议吗?我宁愿不使用for循环,因为有大约.2M行.

Aru*_*run 12

data.table版本1.8.10(CRAN中的稳定版本)中,有一个(n)(未导出的)函数被调用duplist,正是这样做的.它也是用C语言编写的,因此速度非常快.

require(data.table) # 1.8.10
data.table:::duplist(x[, 3:5]) 
# [1] 1 4 5
Run Code Online (Sandbox Code Playgroud)

如果你正在使用data.table(1.8.11)的开发版本,那么有一个更高效的版本(在内存方面)重命名为uniqlist,完成相同的工作.可能这应该导出到下一个版本.似乎不止一次出现过SO.让我们来看看.

require(data.table) # 1.8.11
data.table:::uniqlist(x[, 3:5])
# [1] 1 4 5
Run Code Online (Sandbox Code Playgroud)

  • Nikos,`uniqlist` /`duplist`是`data.table`包中的一个函数.因为它没有导出,所以你必须使用`data.table :::`(这里`data.table`指的是包)操作符来访问该函数.它基本上可以在data.frames/data.tables上运行(因为它需要列表输入).希望这可以解决问题吗? (3认同)
  • 他阿伦,太棒了。老实说,我几乎只使用 data.table。如果您不介意的话,还有一个问题。当我运行 data.frame::duplist 时,出现错误 [...] not type list。参数不应该是 data.table?只是为了澄清,这正是我正在寻找的功能。一旦我收到您对我的问题的评论,我将接受这个答案。谢谢 (2认同)
  • 我才意识到你是一个`data.table`开发者 - 难怪![提交的问题](https://github.com/arunsrinivasan/datatable/issues/3). (2认同)