Добавление последовательности данных панели для определенного значения - PullRequest
0 голосов
/ 30 октября 2018

Я действительно новичок в 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. Это, по сути, последовательность выбора 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 голосов
/ 30 октября 2018

Мы также можем использовать 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))
0 голосов
/ 30 октября 2018
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)
...