Добавление нового столбца с помощью dplyr путем поиска по набору данных - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь добавить новый столбец во фрейм данных, но сталкиваюсь с некоторой проблемой, так как мой ход мыслей, похоже, не работает.

Мой вопрос основан на country-aggregated.csv из это источник GitHub.

Взглянув на голову, он показывает:

enter image description here

Что бы я хотел чтобы сделать, это добавить новый столбец с описанием новых смертей на этот день. Это рассчитывается путем взятия Смертей того дня за вычетом Смертей предыдущего дня.

Моя идея состояла в том, чтобы создать копию и использовать ее в качестве ссылки. Вот так:

tb_copy <- tb
tb <- tb %>% mutate(newDeaths = tb_copy %>% filter(tb_copy$Country == tb$Country) %>% filter(tb_copy$Date == tb$Yesterday) %>% pull(Deaths))

Это не работает, не во всех странах ежедневно регистрируется число погибших. Например, Нидерланды, кажется, в наборе данных каждый день. Как я могу принять это во внимание и сделать так, чтобы оно вычитало не количество смертей за предыдущий день, а количество последней вставки для этой страны?

Ошибка с использованием приведенного выше кода:

Error: Column `newDeaths` must be length 175 (the number of rows) or one, not 0
In addition: Warning message:
Incompatible methods ("Ops.factor", "==.Date") for "=="

Редактировать: мне пришлось отредактировать код в этом вопросе, так как я нашел в нем ошибку, из-за которой он работал без ошибок.

Ответы [ 2 ]

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

Date является фактором, вы должны сначала преобразовать его в класс Date, arrange данные в Country и Date, group_by Country и вычесть значения, используя lag.

library(dplyr)

df %>%
 mutate(Date = as.Date(Date)) %>%
 arrange(Country, Date) %>% 
 group_by(Country) %>%
 mutate(New_deaths = Deaths - lag(Deaths)) 
0 голосов
/ 01 апреля 2020

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

library(data.table)
setDT(df)[order(Country, as.IDate(Date)), New_deaths := Deaths -
          shift(Deaths), by = Country]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...