R: Создать условную переменную на основе факторного уровня одной переменной и присвоить всем строкам одной группы - PullRequest
0 голосов
/ 15 мая 2018

Вот пример моих данных.Столбец «first_tx» - это мой желаемый вывод:

ID   first_date   dates        txtype     first_tx
11   2015-12-23   2015-12-23   A          A
11   2015-12-23   2016-12-23   A          A
11   2015-12-23   2017-12-23   B          A
22   2015-11-01   2015-11-01   B          B
22   2015-11-01   2016-11-01   C          B
22   2015-11-01   2016-12-01   C          B

Я пытаюсь создать «first_tx» по группам на основе факторного уровня «txtype», когда «first_date» равно «date»

Я пытался

data$first_tx[which(data$first_date==data$dates)] <- as.character(data$txtype)[which(data$first_date==data$dates)]

Это дало мне следующий вывод:

ID   first_date   dates        txtype     first_tx
11   2015-12-23   2015-12-23   A          A
11   2015-12-23   2016-12-23   A          NA
11   2015-12-23   2017-12-23   B          NA
22   2015-11-01   2015-11-01   B          B
22   2015-11-01   2016-11-01   C          NA
22   2015-11-01   2016-12-01   C          NA

Однако вместо NA я хотел бы, чтобы все строки для каждого идентификатора имели одинаковые соответствующиеУровень "txtype".

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Используя dplyr и tidyr, я могу создать ожидаемый результат.

library(dplyr)
library(tidyr)

df %>% 
  mutate(first_tx = ifelse(first_date == dates, txtype, NA)) %>% 
  fill(first_tx)

  ID first_date      dates txtype first_tx
1 11 2015-12-23 2015-12-23      A        A
2 11 2015-12-23 2016-12-23      A        A
3 11 2015-12-23 2017-12-23      B        A
4 22 2015-11-01 2015-11-01      B        B
5 22 2015-11-01 2016-11-01      C        B
6 22 2015-11-01 2016-12-01      C        B

data:

df <- structure(list(ID = c(11L, 11L, 11L, 22L, 22L, 22L), 
               first_date = c("2015-12-23", "2015-12-23", "2015-12-23", "2015-11-01", "2015-11-01", "2015-11-01"), 
               dates = c("2015-12-23", "2016-12-23", "2017-12-23", "2015-11-01", "2016-11-01", "2016-12-01"), 
               txtype = c("A", "A", "B", "B", "C", "C")),
          .Names = c("ID", "first_date", "dates", "txtype"), 
          row.names = c(NA, -6L), 
          class = "data.frame")
0 голосов
/ 15 мая 2018

Я поиграл с этим, и это сработало:

data <- data %>% group_by(ID) %>% mutate(first_tx = {if (first_date == dates) txtype[min(which(first_date == dates))] else NA})

Спасибо @phiver за вашу помощь!

0 голосов
/ 15 мая 2018

вы что-то наподобие этого делаете ??

library(data.table)
data <- data.table(
  ID = c('11', '11', '11', '22', '22', '22'),
  first_date = c('2015-12-23', '2015-12-23', '2015-12-23', '2015-11-01', '2015-11-01', '2015-11-01'),
  dates = c('2015-12-23', '2016-12-23', '2017-12-23', '2015-11-01', '2016-11-01', '2016-12-01'),
  txtype = c('A', 'A', 'B', 'B', 'C', 'C')
)


data[first_date == dates,
     ':='(first_tx = txtype),
     by = .(txtype)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...