Есть ли какое-либо решение в R для присвоения ИСТИНА / ЛОЖЬ первому вхождению (наблюдаем за текущий период, а не за предыдущий) - PullRequest
1 голос
/ 06 мая 2020

Я определяю первое появление как наблюдение одной переменной в текущем периоде, но не в предыдущем периоде (1 период эквивалентен 1 году).

Поэтому в следующем примере я хочу проверить, не продукт компании V3 (третий столбец) наблюдается впервые (в соответствии с определением, которое я дал ранее) с учетом временной переменной V2 (второй столбец).

a <- as.data.frame(matrix(c(1,1,1,1,1,2005,2006,2007,2009,2010, "A", "B", "A", "A", "A"), ncol = 3))

Я хочу создать индикатор нового столбца (решением будет V4), который учитывает первое появление (наблюдение в текущем периоде, которое не наблюдалось в предыдущий период)

b <- as.data.frame(matrix(c(1,1,1,1,1,2005,2006,2007,2009,2010, "A", "B", "A", "A", "A","TRUE", "TRUE", "TRUE", "TRUE", "FALSE"), ncol = 4))

Я пробовал с min () функции, а также с сумасшедшими петлями. Но я не нашел подходящего решения.

Примечание. V1 представляет собой идентификатор компании. В моей базе данных тысячи различных компаний

Есть подсказка?

С уважением

Ответы [ 3 ]

0 голосов
/ 06 мая 2020

Вы ищите:

a$V4 <- !duplicated(a)
0 голосов
/ 07 мая 2020

Вариант с использованием data.table:

library(data.table)
DT <- fread("Company Year Product
1 2005  A
1 2006  B
1 2007  A
1 2009  A
1 2010  A")

DT[, yearBef := Year - 1L]
DT[, NotInLastYear := DT[DT, on=.(Company, Product, Year=yearBef), 
    fcoalesce(x.Year==i.Year, TRUE)]]
0 голосов
/ 06 мая 2020

Если я правильно понял. Попробуйте сделать так

library(tidyverse)
a %>% 
  group_by(V2, V3) %>% 
  mutate(V4 = row_number() == 1)
...