Рассчитать разницу в несбалансированном множестве - PullRequest
0 голосов
/ 15 апреля 2019

У меня несбалансированный фрейм данных с датой, местностью и ценами. Я хотел бы рассчитать разницу в цене среди разных населенных пунктов по дате. Мои данные несбалансированы, и для получения разной цены я думаю создать данные (населенные пункты), чтобы сбалансировать данные.

Мои данные выглядят так:

library(dplyr)
set.seed(123)
df= data.frame(date=(1:3),
    locality= rbinom(21,3, 0.2),
    price=rnorm(21, 50, 20)) 

df %>%
arrange(date, locality)

>    date locality     price
1     1        0  60.07625
2     1        0  35.32994
3     1        0  63.69872
4     1        1  54.76426
5     1        1  66.51080
6     1        1  28.28602
7     1        2  47.09213
8     2        0  26.68910
9     2        1 100.56673
10    2        1  48.88628
11    2        1  48.29153
12    2        2  29.02214
13    2        2  45.68269
14    2        2  43.59887
15    3        0  60.98193
16    3        0  75.89527
17    3        0  43.30174
18    3        0  71.41221
19    3        0  33.62969
20    3        1  34.31236
21    3        1  23.76955

Чтобы получить сбалансированные данные, я думаю:

>    date locality     price
1     1        0  60.07625
2     1        0  35.32994
3     1        0  63.69872
4     1        1  54.76426
5     1        1  66.51080
6     1        1  28.28602
7     1        2  47.09213
8     1        2  NA
9     1        2  NA
10    2        0  26.68910
10    2        0  NA
10    2        0  NA
11    2        1 100.56673
12    2        1  48.88628
13    2        1  48.29153
14    2        2  29.02214
15    2        2  45.68269
16    2        2  43.59887
etc...

Наконец, чтобы получить разницу между двумя местами, я думаю:

>   date      diff(price, 0-1)     diff(price, 0-2)    diff(price, 1-2)
1     1      60.07625-54.76426    60.07625-47.09213    etc...
2     1      35.32994-66.51080    35.32994-NA
3     1      63.69872-28.28602    63.69872-NA

1 Ответ

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

Вам не нужно балансировать свои данные. Если вы используете dcast, он добавит NA s для вас.

Сначала преобразуйте данные, чтобы показать отдельные столбцы для каждого населенного пункта

library(data.table)
library(tidyverse)
setDT(df)

df[, rid := rowid(date, locality)]
df2 <- dcast(df, rid + date ~ locality, value.var = 'price')

#     rid date        0         1        2
#  1:   1    1 60.07625  54.76426 47.09213
#  2:   1    2 26.68910 100.56673 29.02214
#  3:   1    3 60.98193  34.31236       NA
#  4:   2    1 35.32994  66.51080       NA
#  5:   2    2       NA  48.88628 45.68269
#  6:   2    3 75.89527  23.76955       NA
#  7:   3    1 63.69872  28.28602       NA
#  8:   3    2       NA  48.29153 43.59887
#  9:   3    3 43.30174        NA       NA
# 10:   4    3 71.41221        NA       NA
# 11:   5    3 33.62969        NA       NA

Затем создайте фрейм данных to_diff разностей для расчета и pmap для расчета разниц. Здесь c0_1 соответствует тому, что вы называете в своем вопросе diff(price, 0-1).

to_diff <- CJ(0:2, 0:2)[V1 < V2]
pmap(to_diff, ~ df2[[as.character(.x)]] - df2[[as.character(.y)]]) %>% 
  setNames(paste0('c', to_diff[[1]], '_', to_diff[[2]])) %>% 
  bind_cols(df2[, 1:2])

# A tibble: 11 x 5
#      c0_1   c0_2  c1_2   rid  date
#     <dbl>  <dbl> <dbl> <int> <int>
#  1   5.31  13.0   7.67     1     1
#  2 -73.9   -2.33 71.5      1     2
#  3  26.7   NA    NA        1     3
#  4 -31.2   NA    NA        2     1
#  5  NA     NA     3.20     2     2
#  6  52.1   NA    NA        2     3
#  7  35.4   NA    NA        3     1
#  8  NA     NA     4.69     3     2
#  9  NA     NA    NA        3     3
# 10  NA     NA    NA        4     3
# 11  NA     NA    NA        5     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...