小编use*_*975的帖子

如何撤消data.table中的setkey排序?

假设我有一个数据表DT,我用set键更改了顺序

setkey(DT,mykey)
Run Code Online (Sandbox Code Playgroud)

然后,也许我从另一张桌子加入一些东西.

DT=DT2[DT]
Run Code Online (Sandbox Code Playgroud)

有没有办法恢复我原来的行排序?我知道,我可以通过在使用setkey之前显式包含索引来实现.

N=Nrow(DT)
DT[,orig_index:=1:N]
setkey(DT,mykey)
DT=DT2[DT]
setkey(DT,orig_index)
DT[,orig_index:=NULL]
Run Code Online (Sandbox Code Playgroud)

有更简单的方法吗?如果我使用order而不是set key这样做,这会更简单一些.

o=order(DT$mykey)
uo=order(o)
setkey(DT,mykey)
DT=DT2[DT]
DT=DT[uo,]
Run Code Online (Sandbox Code Playgroud)

如果setkey可以通过这样的方式反转,我会觉得很酷

setkey(DT,mykey,save.unset=T)
DT=DT2[DT]
unsetkey(DT)
Run Code Online (Sandbox Code Playgroud)

这里save.unset = T会告诉data.table保存最后一次重新排序,以便可以反转.

好吧,也许吧

setkey(DT, reorder=F)
DT=DT2[DT]
Run Code Online (Sandbox Code Playgroud)

此选项将告诉data.table在不实际更改DT顺序的情况下使用连接的键排序或其他任何内容.不确定这是否可行或自然实施.

r data.table

14
推荐指数
1
解决办法
1246
查看次数

如何使用R包data.table和滚动连接查找最后一个或下一个条目

Lets say I have a data table like this.

   customer_id time_stamp value
1:           1        223     4
2:           1        252     1
3:           1        456     3
4:           2        455     5
5:           2        632     2
Run Code Online (Sandbox Code Playgroud)

这样customer_id和time_stamp一起形成一个唯一的密钥.我想添加一些新列,指示"value"的上一个和最后一个值.也就是说,我想要这样的输出.

  customer_id time_stamp value value_PREV value_NEXT
1:           1        223     4         NA          1
2:           1        252     1          4          3
3:           1        456     3          1         NA
4:           2        455     5         NA          2
5:           2        632     2          5         NA
Run Code Online (Sandbox Code Playgroud)

我希望这很快,并且可以处理稀疏,不规则的时间.我认为data.table滚动连接会为我做.但是,滚动连接似乎找到最后一次或同一时间.因此,如果您对同一个表的两个副本进行滚动连接(在将_PREV添加到副本的列名之后),则这不起作用.您可以通过在副本的时间变量中添加一个小数字来捏造它,但这有点尴尬.

有没有办法简单地使用rollin join或其他一些data.table方法?我找到了一种有效的方法,但它仍然需要大约40行R代码.如果滚动连接可以被告知寻找最后一次不包括相同的时间,这似乎是一个单行.或许还有其他一些巧妙的伎俩.

这是示例数据.

data=data.table(customer_id=c(1,2,1,1,2),time_stamp=c(252,632,456,223,455),value=c(1,2,3,4,5))
data_sorted=data[order(customer_id,time_stamp)]
Run Code Online (Sandbox Code Playgroud)

这是我写的代码.请注意,将NA放入customer_id不同的行会引发警告,可能需要更改.我让他们在下面评论.有没有人建议更换这两条线?

add_prev_next_cbind<-function(data,ident="customer_id",timecol="time_stamp",prev_tag="PREV",
                   next_tag="NEXT",sep="_"){
  o=order(data[[ident]],data[[timecol]])
  uo=order(o)
  data=data[o,] …
Run Code Online (Sandbox Code Playgroud)

r data.table

7
推荐指数
2
解决办法
1176
查看次数

如何用NA替换整行data.table?

这似乎应该很容易,但我无法弄清楚.

>d=data.table(x=1:5,y=11:15,z=letters[1:5])
>d
   x  y z
1: 1 11 a
2: 2 12 b
3: 3 13 c
4: 4 14 d
5: 5 15 e
Run Code Online (Sandbox Code Playgroud)

现在,我已经确定第3行是坏数据.我希望所有这些都设置为NA.

d[3,]<-NA
Run Code Online (Sandbox Code Playgroud)

警告消息:在[<-.data.table(*tmp*,3,,value = NA)中:将"逻辑"RHS强制转换为"字符"以匹配列的类型.首先将目标列更改为"逻辑"(通过创建新的"逻辑"向量长度5(整个表的nrows)并分配;即"替换"列),或将RHS强制为"字符"(例如1L,NA_) [real | integer] _,as.*等)使你的意图清晰,速度快.或者,请在创建表格时正确设置列类型,并坚持使用.

然而,它似乎有效.

> d
    x  y  z
1:  1 11  a
2:  2 12  b
3: NA NA NA
4:  4 14  d
5:  5 15  e
Run Code Online (Sandbox Code Playgroud)

如果我转换为data.frame,它也可以工作,但没有警告.但后来我需要转换回来,这似乎很尴尬.有没有更好的办法?

r data.table

5
推荐指数
2
解决办法
3290
查看次数

标签 统计

data.table ×3

r ×3