Как посчитать количество строк на основе определенного значения в наборе данных панели? - PullRequest
0 голосов
/ 16 апреля 2019

Я обрабатываю данные панели как df. Таким образом, у меня есть уникальный UserID (Uid), TimeVariable (TV) и моя основная интересующая переменная (MV, фиктивная кодировка). Каждый ряд представляет уникальную комбинацию UiD TV. Теперь я хочу создать новую переменную (NV), которая подсчитывает в основном количество событий (MV = 1), которые происходят до времени TV.

Контекст: я хочу иметь переменную подсчета (NV), которая в основном для каждого момента времени подсчитывает, как часто событие MV = 1 происходило до этого момента (TV).

До сих пор мне удавалось только суммировать его по UserId, но не увеличивать его.

Что мне удалось до сих пор:

df <- df %>% group_by(user_id) %>% mutate(NV=count_if(1,MV))

Результат выдается my в совокупности для каждого идентификатора пользователя для MV

Так что df выглядит так:

UI TV MV
1  1  0
1  2  1
1  3  0
2  1  0
2  2  0
2  3  1
2  4  2
3  1  1
3  2  0
3  3  1
3  4  1

Результат с моим кодом на данный момент:

UI TV MV NV
1  1  0  1
1  2  1  1
1  3  0  1
2  1  0  2
2  2  0  2
2  3  1  2
2  4  2  2
3  1  1  3
3  2  0  3
3  3  1  3
3  4  1  3

Что я на самом деле хочу:

UI TV MV NV
1  1  0  0
1  2  1  1
1  3  0  1
2  1  0  0
2  2  0  0
2  3  1  1
2  4  2  2
3  1  1  1
3  2  0  1
3  3  1  2
3  4  1  3

Заранее большое спасибо за помощь!

1 Ответ

0 голосов
/ 16 апреля 2019

Мы могли бы group_by UI и взять совокупную сумму вхождения MV == 1

library(dplyr)

df %>%
  group_by(UI) %>%
  mutate(NV = cumsum(MV == 1))


#      UI    TV    MV    NV
#   <int> <int> <int> <int>
# 1     1     1     0     0
# 2     1     2     1     1
# 3     1     3     0     1
# 4     2     1     0     0
# 5     2     2     0     0
# 6     2     3     1     1
# 7     2     4     2     1
# 8     3     1     1     1
# 9     3     2     0     1
#10     3     3     1     2
#11     3     4     1     3

В базе R мы можем использовать ave

with(df, ave(MV == 1, UI, FUN = cumsum))
#[1] 0 1 1 0 0 1 1 1 1 2 3

данные

df <- structure(list(UI = c(1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 
3L), TV = c(1L, 2L, 3L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), MV = c(0L, 
1L, 0L, 0L, 0L, 1L, 2L, 1L, 0L, 1L, 1L)), class = "data.frame", 
row.names = c(NA, 
-11L))
...