【问题标题】:Panel data sequence adding for a particular value为特定值添加面板数据序列
【发布时间】:2018-10-30 04:17:11
【问题描述】:

我是 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中进行排序。

 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 

【问题讨论】:

  • 如果这对您有用,请考虑通过单击投票按钮旁边的复选标记来接受答案。

标签: r dataframe panel


【解决方案1】:
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)

【讨论】:

    【解决方案2】:

    我们也可以使用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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-28
      • 2015-05-08
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多