面板数据序列添加特定值

时间:2018-10-30 04:17:12

标签: r dataframe panel

我真的是r和stackoverflow的新手。对于这个新手问题,我们事先表示歉意。

我有一个如下表所示的面板数据集。

 ID  Choice  
  1     1  
  1     1  
  1     2  
  1     5  
  1     1  
  2     1  
  2     1  
  2     5  
  2     1  
  2     1  
  3     3  
  3     1  
  3     1  
  3     2  
  3     4  

当选择为1时,我想添加另一列,如下表所示。这基本上是在ID中对选择1进行排序。

 ID  Choice  BUS  
  1     1  0  (The first 1 will be considered as 0)  
  1     1  1  
  1     2  1  
  1     5  1  
  1     1  2 
  2     1  0  
  2     1  1  
  2     5  1  
  2     1  2  
  2     1  3
  3     3  0  
  3     1  0  
  3     1  1  
  3     2  1  
  3     4  1 

2 个答案:

答案 0 :(得分:2)

with(df, ave(Choice == 1, ID, FUN = cumsum))

几乎可以为您提供所需的内容,但是由于您想将第一个1视为0,因此需要进行一些修改。

df$BUS <- with(df, ave(Choice == 1, ID, FUN = function(x) {
     inds = cumsum(x)
    ifelse(inds > 0, inds - 1, inds)
}))

df


#   ID Choice BUS
#1   1      1   0
#2   1      1   1
#3   1      2   1
#4   1      5   1
#5   1      1   2
#6   2      1   0
#7   2      1   1
#8   2      5   1
#9   2      1   2
#10  2      1   3
#11  3      3   0
#12  3      1   0
#13  3      1   1
#14  3      2   1
#15  3      4   1

在这里,我们从前1个累加总和中减去1。


dplyr中使用相同的逻辑

library(dplyr)
df %>%
  group_by(ID) %>%
  mutate(inds = cumsum(Choice == 1), 
        BUS = ifelse(inds > 0, inds - 1, inds)) %>%
  select(-inds)

答案 1 :(得分:1)

我们也可以使用data.table

library(data.table)
setDT(df1)[, BUS := pmax(0, cumsum(Choice == 1)-1), ID]
df1
#    ID Choice BUS
# 1:  1      1   0
# 2:  1      1   1
# 3:  1      2   1
# 4:  1      5   1
# 5:  1      1   2
# 6:  2      1   0
# 7:  2      1   1
# 8:  2      5   1
# 9:  2      1   2
#10:  2      1   3
#11:  3      3   0
#12:  3      1   0
#13:  3      1   1
#14:  3      2   1
#15:  3      4   1

数据

df1 <- structure(list(ID = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 
 3L, 3L, 3L, 3L, 3L), Choice = c(1L, 1L, 2L, 5L, 1L, 1L, 1L, 5L, 
 1L, 1L, 3L, 1L, 1L, 2L, 4L)), class = "data.frame", row.names = c(NA, 
 -15L))