Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在上一组中添加具有可变值的列_R_Dplyr_Data.table - Fatal编程技术网

R 在上一组中添加具有可变值的列

R 在上一组中添加具有可变值的列,r,dplyr,data.table,R,Dplyr,Data.table,我有如下数据,其中每个id在每个时间都有一个状态。我想添加一列prev_status,显示上一次时间中status的值 set.seed(10); library(dplyr); library(data.table) df <- data.table(time = sample(1:3, 20, T), status = sample(letters[1:15], 20, T) )[order(time) ][, id :=

我有如下数据,其中每个
id
在每个
时间都有一个
状态
。我想添加一列
prev_status
,显示上一次
时间中
status
的值

set.seed(10); library(dplyr); library(data.table)

df <- data.table(time = sample(1:3, 20, T), 
                 status = sample(letters[1:15], 20, T)
      )[order(time)
      ][, id := 1:.N, by = time]

    time status id
 1:    1      j  1
 2:    1      g  2
 3:    1      k  3
 4:    1      m  4
 5:    1      d  5
 6:    1      c  6
 7:    1      m  7
 8:    1      o  8
 9:    2      m  1
10:    2      l  2
11:    2      l  3
12:    2      f  4
13:    2      i  5
14:    2      b  6
15:    2      n  7
16:    2      g  8
17:    2      l  9
18:    2      k 10
19:    3      f  1
20:    3      h  2

是否有更好的方法来实现这一点,即为整个data.frame创建
prev_status
?我对
dplyr
数据持开放态度。table
解决方案(以及base R)。

dplyr
有一个
lag()
函数,使这一过程变得简单

df %>% 
  arrange(time) %>% 
  group_by(id) %>% 
  mutate(prev_status=lag(status))

没想到会这么容易。将
data.table
解决方案放在这里以备将来参考:
df[订单(时间)][,prev_状态:=shift(状态),by=id]
@Renu当您与
DT[i][…]链接时,对原始表的引用被破坏。如果您改为
df[order(time),prev_status:=shift(status),by=id]
,则新列将添加到原始表中。
df %>% 
  arrange(time) %>% 
  group_by(id) %>% 
  mutate(prev_status=lag(status))