Как «заполнить» переменную с помощью dcast - PullRequest
0 голосов
/ 23 сентября 2019

В рамках исследования совместного использования автомобилей я использую таблицы, которые выглядят так:

enter image description here

Проблема в том, чтоне должно быть двух строк: это фактически одна поездка (тот же водитель, тот же час отправления), а буква «С» должна быть в первой строке в столбце «Пассажир 2».

Следовательно, япытаясь автоматически «заполнить» столбец Passenger2, когда Date / Hour_dep / Driver идентичны.ID_Dep - это другое дело, он автоматически генерируется для каждой строки, CDE002 просто не должно существовать.

Из того, что я прочитал, dcast - мой лучший выход из этого.Но я ... не могу понять, как правильно его использовать.Я даже не уверен, что мне следует использовать dcast.В какой-то момент с моей реальной таблицей мне удалось получить таблицу сопряженности с одним столбцом для каждого возможного значения Passenger2.Если бы мне удалось извлечь первое не-значение NA, начиная с самого левого столбца, это дало бы мне таблицу, которую я хотел.Но мне также не удалось его получить.

Вот код, воссоздающий таблицу и мой полностью не работающий dcast, любая помощь с радостью приветствуется.

test_iddep<-c("AAA1","BBB2")
test_Date<-c("01/05/2019","01/05/2019")
test_hourdep <- c("8:00","8:00")
test_driv<-c("A","A")
test_pass1<-c("B","C")
test_pass2<-c(NA,NA)

test_table <- data.frame(test_iddep,test_Date,test_hourdep,test_driv,test_pass1,test_pass2)

table_arranged <- dcast(test_table, test_driv + test_Date + test_hourdep + test_pass1 ~ test_pass2, 
                        margins=c("test_driv","test_Date","test_hourdep")) 

1 Ответ

0 голосов
/ 23 сентября 2019

Я подозреваю, что есть несколько различных подходов, которые вы можете использовать (и, вероятно, лучше).

Если вы действительно хотите использовать dcast, здесь может быть один подход:

ПервыйЯ бы melt данные на основе даты, часа и водителя.Затем создаст идентификатор для каждой из этих уникальных комбинаций.Затем для каждого идентификатора, добавил бы порядковый номер для каждого пассажира.Тогда dcast:

library(reshape2)

test_table <- data.frame(
  test_iddep = c("AAA1", "BBB2", "CCC3", "DDD4", "EEE5"),
  test_Date = c("01/05/2019", "01/05/2019", "01/07/2019", "01/07/2019", "01/07/2019"),
  test_hourdep = c("8:00", "8:00", "10:00", "10:00", "10:00"),
  test_driv = c("A", "A", "B", "B", "B"),
  test_pass1 = c("B", "C", "D", "E", "F")
)

x <- melt(test_table[-1], id.vars = c("test_driv", "test_Date", "test_hourdep"))
x$id <- cumsum(!duplicated(x[1:3]))
x$time <- ave(x$id, x$id, FUN=seq_along)
dcast(x, test_driv + test_Date + test_hourdep ~ time, value.var = "value")

  test_driv  test_Date test_hourdep 1 2    3
1         A 01/05/2019         8:00 B C <NA>
2         B 01/07/2019        10:00 D E    F

Пожалуйста, дайте мне знать, если это то, что вы имели в виду для вывода.Я удалил test_iddep, поскольку это звучит так, как будто это не нужно из вашего вопроса.

...