我在R中有两个数据集(下面的这些表只是较小的版本),我想将它们组合成一个新的数据框 .
> meetingtime2
#two columns of datetime that class=factor
ST ET
1 2014-12-22 07:00:00 2014-12-22 07:30:00
2 2014-12-22 07:30:00 2014-12-22 08:00:00
3 2014-12-22 08:00:00 2014-12-22 08:30:00
4 2014-12-22 08:30:00 2014-12-22 09:00:00
5 2014-12-22 09:00:00 2014-12-22 09:30:00
> roomdata2
#three columns; Room=factor, Capacity=integer, Video Conference=numeric
Room Capacity Video.Conference
1 0M02A 16 1
2 0M03A 8 0
3 0M03B 12 1
期望的输出将是15行×5列矩阵 . 简单来说,每个房间的每个时段都有输出 .
#the following is a MANUALLY created output of what the first few rows should look like
Room Capacity Video.Conference ST ET
1 0M02A 16 1 2014-12-22 07:00:00 2014-12-22 07:30:00
2 0M02A 16 1 2014-12-22 07:30:00 2014-12-22 08:00:00
3 0M02A 16 1 2014-12-22 08:00:00 2014-12-22 08:30:00
4 0M02A 16 1 2014-12-22 08:30:00 2014-12-22 09:00:00
5 0M02A 16 1 2014-12-22 09:00:00 2014-12-22 09:30:00
6 0M03A 16 1 2014-12-22 07:00:00 2014-12-22 07:30:00
7 0M03A 16 1 2014-12-22 07:30:00 2014-12-22 08:00:00
#and so forth to 15 rows.
我尝试过使用嵌套循环
#note, the code is written so I can apply to a bigger (1000's of rows) dataset
>mylist<-list()
>for(i in 1:(nrow(roomdata2)))
+{ for(j in 1:(nrow(meetingtime2)))
+mylist[[j]]<- data.frame(roomdata2[i,1],roomdata2[i,2],roomdata2[i,3],
+meetingtime2[j,1],meetingtime2[j,2])
}
>df<-do.call("rbind",mylist)
>df
我得到的输出 . 我得到了最后一个房间的所有时间段,而不是前面的房间
roomdata2.i..1. roomdata2.i..2. roomdata2.i..3. meetingtime2.j..1. meetingtime2.j..2.
1 0M03B 12 1 2014-12-22 07:00:00 2014-12-22 07:30:00
2 0M03B 12 1 2014-12-22 07:30:00 2014-12-22 08:00:00
3 0M03B 12 1 2014-12-22 08:00:00 2014-12-22 08:30:00
4 0M03B 12 1 2014-12-22 08:30:00 2014-12-22 09:00:00
5 0M03B 12 1 2014-12-22 09:00:00 2014-12-22 09:30:00
我知道我的代码远非正确,并且正在给我循环的最后一次迭代 .
我看到这个的另一种方式是每次迭代的连续打印功能
>for(i in 1:(nrow(roomdata2)))
>for(j in 1:(nrow(meetingtime2)))
>print(paste(roomdata2[i,1],roomdata2[i,2],roomdata2[i,3],
+meetingtime2[j,1],meetingtime2[j,2]))
输出
[1] "0M02A 16 1 2014-12-22 07:00:00 2014-12-22 07:30:00"
[1] "0M02A 16 1 2014-12-22 07:30:00 2014-12-22 08:00:00"
[1] "0M02A 16 1 2014-12-22 08:00:00 2014-12-22 08:30:00"
[1] "0M02A 16 1 2014-12-22 08:30:00 2014-12-22 09:00:00"
[1] "0M02A 16 1 2014-12-22 09:00:00 2014-12-22 09:30:00"
[1] "0M03A 8 0 2014-12-22 07:00:00 2014-12-22 07:30:00"
[1] "0M03A 8 0 2014-12-22 07:30:00 2014-12-22 08:00:00"
[1] "0M03A 8 0 2014-12-22 08:00:00 2014-12-22 08:30:00"
[1] "0M03A 8 0 2014-12-22 08:30:00 2014-12-22 09:00:00"
[1] "0M03A 8 0 2014-12-22 09:00:00 2014-12-22 09:30:00"
[1] "0M03B 12 1 2014-12-22 07:00:00 2014-12-22 07:30:00"
[1] "0M03B 12 1 2014-12-22 07:30:00 2014-12-22 08:00:00"
[1] "0M03B 12 1 2014-12-22 08:00:00 2014-12-22 08:30:00"
[1] "0M03B 12 1 2014-12-22 08:30:00 2014-12-22 09:00:00"
[1] "0M03B 12 1 2014-12-22 09:00:00 2014-12-22 09:30:00"
#however the values are not separated, they are just in one set of string for each row.
所需的结果是一个直接在上面的表,而是一个数据帧,其中每个值都在一个单独的列中(每个日期和时间在一列中设置在一起) .
我已经查看了列表,lapply,foreach但是我无法绕过解决方案 . 任何帮助将不胜感激,我是初学者,所以我很想学习 .
干杯* dputs
>dput(meetingtime2)
结构(列表(ST =结构(1:5,.Label = c(“22/12/2014 7:00”,“2014年12月22日7:30”,“2014年12月22日8:00”, “2014年12月22日8:30”,“2014年12月22日9:00”),类=“因素”),ET =结构(1:5,.Label = c(“22/12/2014 7 :30“,”2014年12月22日8:00“,”2014年12月22日8:30“,”2014年12月22日9:00“,”2014年12月22日9:30“),课程=“factor”)),. Name = c(“ST”,“ET”),row.names = c(NA,-5L),class =“data.frame”)
>dput(roomdata2)
结构(列表(房间=结构(1:3,.Label = c(“0M02A”,“0M03A”,“0M03B”),类=“因子”),容量= c(16L,8L,12L),视频 . Conference = c(1L,0L,1L)),. Name = c(“Room”,“Capacity”,“Video.Conference”),row.names = c(NA,-3L),class =“data.frame “)
2 回答
使用您的数据:
然后
merge
轻松返回笛卡尔积,因为没有列匹配 .这很丑陋,但应该完成工作 . 鉴于以下数据:
下面的功能应该做你想要的:
Smash(Rooms,Times)返回: