изменить данные и изменить новые имена столбцов - PullRequest
0 голосов
/ 24 октября 2018

У меня есть набор данных, подобный следующему:

data <- data.frame(ID    = rep(1:5,each=4), 
               Event = rep(c("SCR","FUP","FUP","FUP"),5), 
               Date  = c("2016-11-01", "2016-11-10", "2016-12-01", "2017-01-19", 
                         "2017-04-12", "2017-04-04", "2017-05-30", "2017-05-25", 
                         "2018-04-09", "2018-05-02", "2018-05-29", "2018-06-04", 
                         "2017-06-06", "2017-07-26", "2017-09-07", "2017-09-15", 
                         "2016-11-01", "2016-11-10", "2016-12-01", "2017-01-19"))

Я бы хотел, чтобы он выглядел так:

ID    SCR         FUP_1        FUP_2        FUP_3
1     2016-11-01  2016-11-10   2016-12-01   2017-01-19
2     2017-04-12  2017-04-04   2017-05-30   2017-05-25
       .
       .
       .

Я пробовал использовать спред, но он даетMsgstr "Ошибка: повторяющиеся идентификаторы".Я также попытался изменить форму:

reshape(data, idvar = "ID", timevar = "Event", direction = "wide", sep = "_") 

, но он удаляет 2 записи даты и принимает только первую дату наблюдения (см. Вывод ниже)

ID   Date_SCR    Date_FUP
1    2016-11-01  2016-11-10
2    2017-03-06  2017-04-12
3    2017-05-25  2017-01-19
4    2018-05-29  2018-06-04
5    2017-07-26  2017-09-07

Может ли кто-нибудь помочь мне сэтот?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Я не говорю, что это «лучшее» решение, но это автоматически создаст эти теги _num на концах значений Event.

split(my_data, my_data$ID) %>% 
lapply(function(.id){ group_by(.id, Event) %>% 
mutate(new_event = paste0(Event, "_", row_number())) %>%
  ungroup() }) %>%
purrr::reduce(rbind) %>%
dplyr::select(-Event) %>%
as.data.frame() 
0 голосов
/ 24 октября 2018

Для добавления чисел я буду использовать make.unique.Это не красиво, но вы всегда можете переименовать их позже (или исправить это заранее).

Во-первых, измененные данные:

data$Event <- ave(as.character(data$Event), data$ID, FUN=make.unique)
head(data)
#     ID Event       Date
# 1.1  1   SCR 2016-11-01
# 1.2  1   FUP 2016-11-10
# 1.3  1 FUP.1 2016-12-01
# 1.4  1 FUP.2 2017-01-19
# 2.5  2   SCR 2017-04-12
# 2.6  2   FUP 2017-04-04

Base R, некрасивые имена столбцов,по общему признанию:

reshape(data, idvar = "ID", v.names="Date", timevar="Event", direction="wide")
#      ID   Date.SCR   Date.FUP Date.FUP.1 Date.FUP.2
# 1.1   1 2016-11-01 2016-11-10 2016-12-01 2017-01-19
# 2.5   2 2017-04-12 2017-04-04 2017-05-30 2017-05-25
# 3.9   3 2018-04-09 2018-05-02 2018-05-29 2018-06-04
# 4.13  4 2017-06-06 2017-07-26 2017-09-07 2017-09-15
# 5.17  5 2016-11-01 2016-11-10 2016-12-01 2017-01-19

Тидиверс

tidyr::spread(data, Event, Date)
#   ID        FUP      FUP.1      FUP.2        SCR
# 1  1 2016-11-10 2016-12-01 2017-01-19 2016-11-01
# 2  2 2017-04-04 2017-05-30 2017-05-25 2017-04-12
# 3  3 2018-05-02 2018-05-29 2018-06-04 2018-04-09
# 4  4 2017-07-26 2017-09-07 2017-09-15 2017-06-06
# 5  5 2016-11-10 2016-12-01 2017-01-19 2016-11-01

data.table

data.table::dcast(data, ID ~ Event)
# Using 'Date' as value column. Use 'value.var' to override
#   ID        FUP      FUP.1      FUP.2        SCR
# 1  1 2016-11-10 2016-12-01 2017-01-19 2016-11-01
# 2  2 2017-04-04 2017-05-30 2017-05-25 2017-04-12
# 3  3 2018-05-02 2018-05-29 2018-06-04 2018-04-09
# 4  4 2017-07-26 2017-09-07 2017-09-15 2017-06-06
# 5  5 2016-11-10 2016-12-01 2017-01-19 2016-11-01
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...