r: кодирование фиктивных переменных на основе максимального значения для каждого месяца - PullRequest
0 голосов
/ 16 марта 2019

Я хочу закодировать новую переменную с именем df$dummy на основе максимального значения в df$var1 для каждого df$month, где значение будет 1 для максимального значения и 0 для любого другого значения,См. Воспроизводимый набор данных:

df<- data.frame(date= seq.Date(from = as.Date('2017-01-01'), by= 7, 
                length.out = 20), var1= rnorm(20, 5, 3))

df$month<- as.numeric(strftime(df$date, "%m"))

У меня проблемы с концептуализацией условий для функции.В Excel я бы просто использовал функцию maxif и указывал свои критерии.Моя попытка ниже не работает:

df$dummy<- apply(df$var1, MARGIN = 2, 
                 function(x) if_else(max(x) %in% df$month, 1, 0))

Возвращает эту ошибку:

Error in apply(df$var1, MARGIN = 2, function(x) if_else(max(x) %in% df$month,  : 
dim(X) must have a positive length

Как мне кодировать эту фиктивную переменную?Есть ли жизнеспособное решение dplyr, использующее mutate_if?

Ответы [ 2 ]

1 голос
/ 16 марта 2019

с пакетом data.table это довольно легко сделать.

library(data.table)

df<- data.frame(date= seq.Date(from = as.Date('2017-01-01'), by= 7, 
                 length.out = 20), var1= rnorm(20, 5, 3))

df$month<- as.numeric(strftime(df$date, "%m"))

set.DT(df)
df[,dummy:=ifelse(max(var1)==var1,1,0),month]

## df
##           date      var1 month dummy
##  1: 2017-01-01  2.213981     1     0
##  2: 2017-01-08  1.768855     1     0
##  3: 2017-01-15  4.765936     1     0
##  4: 2017-01-22  3.930655     1     0
##  5: 2017-01-29  6.548077     1     1
##  6: 2017-02-05 -1.489263     2     0
##  7: 2017-02-12  4.448080     2     0
##  8: 2017-02-19  9.734254     2     1
##  9: 2017-02-26  3.322127     2     0
## 10: 2017-03-05  8.023423     3     1
## 11: 2017-03-12  6.915339     3     0
## 12: 2017-03-19  3.563988     3     0
## 13: 2017-03-26  4.393971     3     0
## 14: 2017-04-02  8.361803     4     0
## 15: 2017-04-09  3.636038     4     0
## 16: 2017-04-16  3.804143     4     0
## 17: 2017-04-23 11.269707     4     1
## 18: 2017-04-30  7.024666     4     0
## 19: 2017-05-07 10.771904     5     1
## 20: 2017-05-14  4.877943     5     0
1 голос
/ 16 марта 2019

В dplyr ключ должен использовать group_by для разделения фрейма данных по месяцам.Тогда var1 == max(var1) будет работать в течение каждого месяца, как вы хотите.Например:

library(dplyr)
df<- data.frame(date= seq.Date(from = as.Date('2017-01-01'), by= 7, length.out = 20), var1= rnorm(20, 5, 3))
df$month<- as.numeric(strftime(df$date, "%m"))

df <- df %>%
  group_by(month) %>%
  mutate(dummy = as.integer(var1 == max(var1))) %>%
  ungroup
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...