R вычесть значение на основе категории и даты в обратном направлении - PullRequest
3 голосов
/ 16 апреля 2020

Я новичок в stackoverflow, но не новичок в R. Однако у меня возникли некоторые проблемы при вычитании некоторых значений из таблицы. Я создал небольшой пример, который показывает настройку и мою попытку (пока):

library(tidyverse)
fruit<-tibble(date=rep(seq.Date(as.Date('2020-03-01'),
                                as.Date('2020-03-04'),
                                by='day'),3),
              cat=c(rep('apple',4),
                    rep('peach',4),
                    rep('strawberry', 4)),
              value=1:12)


bananas<-tibble(date=rev(seq.Date(as.Date('2020-03-01'),
                            as.Date('2020-03-04'),
                            by='day')),
              cat=rep('bananas', 4),
              value= 4:1)

mutate(fruit, 
       value = ifelse(cat=='apple' & date %in% bananas$date,
                                    value-bananas$value, value))

Я знаю, что моя конструкция cat=='apple' & date %in% bananas$date обычно тоже не должна работать. Тем не менее, я не могу понять, как установить более крупный тиббл, а затем векторизовать совпадение дат, чтобы вычесть правильные значения друг из друга, а затем снова вернуть весь более крупный тиббл.

Простой обходной путь - создать уникальный «идентификатор помощника» путем вставки категории и даты вместе, но я думаю, что должен быть более простой способ.

Надеюсь, проблема прояснится - я был бы рад любому совету.

Бест,

Николас

Ответы [ 2 ]

2 голосов
/ 16 апреля 2020

Возможно, вы имеете в виду что-то вроде этого:

library(dplyr)

left_join(fruit, bananas, by = 'date') %>%
   mutate(value = ifelse(cat.x == 'apple', value.x - value.y, value.x))


# A tibble: 12 x 6
#   date       cat.x      value.x cat.y   value.y value
#   <date>     <chr>        <int> <chr>     <int> <int>
# 1 2020-03-01 apple            1 bananas       1     0
# 2 2020-03-02 apple            2 bananas       2     0
# 3 2020-03-03 apple            3 bananas       3     0
# 4 2020-03-04 apple            4 bananas       4     0
# 5 2020-03-01 peach            5 bananas       1     5
# 6 2020-03-02 peach            6 bananas       2     6
# 7 2020-03-03 peach            7 bananas       3     7
# 8 2020-03-04 peach            8 bananas       4     8
# 9 2020-03-01 strawberry       9 bananas       1     9
#10 2020-03-02 strawberry      10 bananas       2    10
#11 2020-03-03 strawberry      11 bananas       3    11
#12 2020-03-04 strawberry      12 bananas       4    12

Мы объединяем fruit и bananas на date, так что дата совпадает, а затем вычитаем value из banana только если cat - это "apple". Затем вы можете select столбцы, которые вам нужны.

1 голос
/ 16 апреля 2020

точно - большое спасибо!

Здесь все это (включая добавление "бананов" к фруктам)

left_join(fruit, bananas, by = 'date') %>%
  mutate(value = ifelse(cat.x == 'apple', value.x - value.y, value.x))%>%
  select(-c(value.x, cat.y, value.y))%>%
  rename(cat=cat.x)%>%bind_rows(arrange(bananas, date))
...