Создание относительной позиции для наблюдения - PullRequest
0 голосов
/ 23 марта 2020

Я новичок в R, и у меня возникли проблемы с созданием "wanted.column" в моем наборе данных. Данные сортируются по дате и компании (данные панели), и я хочу знать относительную позицию по сравнению с событием для каждой компании (фиктивная переменная = 1, если событие происходит). Пробовал с помощью group_by в l oop, но не могу заставить его работать. Благодарю за любую помощь, которую я могу получить.

data <- structure(list(DATE = structure(c(17358, 17359, 17360, 17361, 
                              17364, 17365, 17366, 17367, 17368, 17371, 17372,
                              17358, 17359, 17360, 17361, 
                              17364, 17365, 17366, 17367, 17368, 17371, 17372), class = "Date"), 
           Ret = c(-0.012, 0.023, -0.002, 0.004, -0.006, 
                     -0.014, -0.019, -0.005, -0.006, -0.011, -0.019,
                   -0.012, 0.023, -0.002, 0.004, -0.006, 
                   -0.014, -0.019, -0.005, -0.006, -0.011, -0.019
           ), Company = c("A", "A", "A", "A", "A", 
                          "A", "A", "A", "A", "A", "A",
                          "B", "B", "B", "B", "B", 
                          "B", "B", "B", "B", "B", "B"
           ), Dummy = c(NA_real_, NA_real_, NA_real_, NA_real_, 1, 
                        NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_,
                        NA_real_, NA_real_, NA_real_, NA_real_, 1, 
                        NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_
           ), wanted.column = c(-4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6,
                                -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6
           )), row.names = 1:22, class = "data.frame")

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

С data.table мы можем сделать

library(data.table)
setDT(data)[,  if(all(is.na(Dummy))) NA_integer_ else .N - which.max(Dummy), by = Company]
0 голосов
/ 23 марта 2020

Мы могли бы вычесть row_number из позиции, где Dummy == 1 для каждого Company.

library(dplyr)
data %>% 
   group_by(Company) %>% 
   mutate(new_col = if(all(is.na(Dummy))) NA else row_number() - which.max(Dummy))

#   DATE          Ret Company Dummy wanted.column new_col
#   <date>      <dbl> <chr>   <dbl>         <dbl>   <int>
# 1 2017-07-11 -0.012 A          NA            -4      -4
# 2 2017-07-12  0.023 A          NA            -3      -3
# 3 2017-07-13 -0.002 A          NA            -2      -2
# 4 2017-07-14  0.004 A          NA            -1      -1
# 5 2017-07-17 -0.006 A           1             0       0
# 6 2017-07-18 -0.014 A          NA             1       1
# 7 2017-07-19 -0.019 A          NA             2       2
# 8 2017-07-20 -0.005 A          NA             3       3
# 9 2017-07-21 -0.006 A          NA             4       4
#10 2017-07-24 -0.011 A          NA             5       5
# … with 12 more rows

В базе R, используя тот же лог c, мы можем использовать ave:

data$new_col <- with(data, ave(Dummy, Company, FUN = function(x) 
                if(all(is.na(x))) NA else  seq_along(x) - which.max(x)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...