Как посмотреть предыдущие значения в фрейме данных R по идентификатору и году? - PullRequest
0 голосов
/ 05 марта 2019

Скажем, у меня есть фрейм данных, который выглядит следующим образом:

  ID Year Value    Value_Prior.Year
 aaa 2010   800               
 bbb 2010  1000               
 ccc 2010   900
 ccc 2010   400      
 aaa 2011   400               
 bbb 2011   300               
 ccc 2011   100
 bbb 2013   100      

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

РЕДАКТИРОВАТЬ: Могут отсутствовать несколько лет и некоторые дубликаты.Таким образом, в приведенном выше примере последний «Value_Prior.Year» должен быть NA, а значение «от второго до последнего» должно быть суммой или 1300.

Спасибо!

1 Ответ

0 голосов
/ 05 марта 2019

Здесь однострочник, использующий только основание R.

transform(DF, PriorYearValue = ave(Value, ID, FUN = function(x) c(NA, head(x, -1))))

, дающий:

   ID Year Value PriorYearValue
1 aaa 2010   800             NA
2 bbb 2010  1000             NA
3 ccc 2010   900             NA
4 aaa 2011   400            800
5 bbb 2011   300           1000
6 ccc 2011   100            900

Примечание

Вход в воспроизводимом виде предполагается равным:

Lines <- "
  ID Year Value
 aaa 2010   800               
 bbb 2010  1000               
 ccc 2010   900               
 aaa 2011   400               
 bbb 2011   300               
 ccc 2011   100"
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE)

Обновление

Что касается EDIT, который был добавлен к вопросу, сложные объединения легко выполняются в SQL, поэтому:

Lines <-  '
 ID Year Value
 aaa 2010   800               
 bbb 2010  1000               
 ccc 2010   900
 ccc 2010   400      
 aaa 2011   400               
 bbb 2011   300               
 ccc 2011   100
 bbb 2013   100'
DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE)

library(sqldf)
sqldf("select a.*, sum(b.Value) PrevYearValue
       from DF a 
       left join DF b on a.ID = b.ID and a.Year - 1 = b.Year
       group by a.rowid")

, что дает:

   ID Year Value PrevYearValue
1 aaa 2010   800            NA
2 bbb 2010  1000            NA
3 ccc 2010   900            NA
4 ccc 2010   400            NA
5 aaa 2011   400           800
6 bbb 2011   300          1000
7 ccc 2011   100          1300
8 bbb 2013   100            NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...