如何使用dcast“填充”变量

时间:2019-09-23 16:10:34

标签: r dcast

作为汽车共享研究的一部分,我使用的表格如下:

enter image description here

这里的问题是不应有两行:这实际上是一个单一的旅程(同一位驾驶员,出发时间相同),而“ C”应该位于“ Passenger2”列的第一行。

因此,当Date / Hour_dep / Driver相同时,我试图自动“填充” Passenger2列。 ID_Dep是另一回事,它是为每一行自动生成的,CDE002根本不应该存在。

从我读到的内容来看,dcast是我最好的解决方法。但是我...无法弄清楚如何正确使用它。我什至不确定dcast实际上是我应该使用的。 在我的实际表的某个时刻,我设法获得了一个对每位旅客2可能值都具有一列的列联表。如果我能够从最左边的列开始提取第一个非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 :(得分:0)

我怀疑您可以使用多种方法(可能更好)。

如果您确实想使用dcast,则可能是一种方法:

首先,我将根据日期,小时和驱动因素melt进行数据分析。然后将为每个唯一组合创建一个ID。然后,对于每个ID,将为每个乘客添加一个序列号。然后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,因为听起来好像您的问题中不需要此内容。