假设我有一个数据表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顺序的情况下使用连接的键排序或其他任何内容.不确定这是否可行或自然实施.
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) 这似乎应该很容易,但我无法弄清楚.
>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,它也可以工作,但没有警告.但后来我需要转换回来,这似乎很尴尬.有没有更好的办法?