Ошибка при попытке определить разницу между наблюдениями в группе - PullRequest
0 голосов
/ 06 января 2019

У меня есть группы из 20, где только одно наблюдение имеет значение одного для переменной, и я пытаюсь преобразовать другие переменные так, чтобы оставшиеся 19 наблюдений и я получили следующую ошибку.

«длинная длина объекта не кратна короткой длине объекта»

library(dplyr)

test <- data.frame('prod_id'= c("shoe", "shoe", "shoe", "shoe", "shoe", 
"shoe", "boat", "boat","boat","boat","boat","boat", "ship", "ship", "ship", 
"ship", "ship", "ship"), 
           'seller_id'= c("a", "b", "c", "d", "e", "f", "a","g", "h", "r", 
"q", "b", "qe", "dj", "d3", "kk", "dn", "de"), 
           'Dich'= c(1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0),
           'price' = c(120, 20, 10, 4, 3, 4, 30, 43, 56, 88, 75, 44, 32, 
21, 44, 54, 55, 33)
            )

Интересно, этот код работает:

test2 <- test %>% 
     group_by(prod_id) %>%
     mutate(price_diff = if(any(Dich ==1)) ((price - price[Dich == 
     1])/(price + price[Dich == 1])/2) else NA) 

Пока этот код

test2 <- test %>% 
     group_by(prod_id) %>%
     mutate(diff_p = if(any(Dich==1)) price - price[Dich == 1] else NA)

выдает ошибку «длинная длина объекта не кратна короткой длине объекта». К сожалению, мне не удалось воспроизвести данные примера, поэтому я надеюсь, что кто-то может понять, в чем проблема.

Я видел этот пост

Большая длина объекта не кратна короткой длине объекта?

но объекты имеют одинаковое количество строк, и я не уверен, почему один синтаксис сработает, хотя небольшое изменение преобразования вызовет ошибку.

1 Ответ

0 голосов
/ 06 января 2019

Ошибка возникает, когда существует более одного значения 'Dich', которое равно 1 для некоторого 'prod_id'. Если имеется только 1 «дич», то mutate будет перерабатывать соответствующую разницу «цен», основанную на этом единственном «диче», но с более чем одним «дичем» переработка становится проблематичной, и mutate необходимо вывести столбец или новый столбец с тем же количеством строк, что и исходный набор данных.

Таким образом, если стратегия состоит в том, чтобы получить «цену» для первого вхождения «Dich» со значением 1, то либо используйте which и установите первую позицию для извлечения «цены»

test %>% 
  group_by(prod_id) %>%
  mutate(diff_p = if(any(Dich==1)) price - price[which(Dich == 1)[1]] else NA)

Или используйте which.max

test %>% 
  group_by(prod_id) %>%
  mutate(diff_p = if(any(Dich==1)) price - price[which.max(Dich == 1)] else NA)

Или используя match

test %>% 
  group_by(prod_id) %>%
  mutate(diff_p = if(any(Dich==1)) price - price[match(1, Dich)] else NA)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...