【发布时间】:2015-03-10 22:59:48
【问题描述】:
我在 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 行 x 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,但我无法理解解决方案。 任何帮助将不胜感激,我是初学者,所以我很想学习。
干杯 * 输出
>dput(meetingtime2)
结构(列表(ST = 结构(1:5,.Label = c(“22/12/2014 7:00”, “22/12/2014 7:30”、“22/12/2014 8:00”、“22/12/2014 8:30”、“22/12/2014 9:00” ), class= "因子"), ET = 结构(1:5, .Label = c("22/12/2014 7:30", “22/12/2014 8:00”、“22/12/2014 8:30”、“22/12/2014 9:00”、“22/12/2014 9:30” ), class= "因子")), .Names = c("ST", "ET"), row.names = c(NA, -5L), class= "data.frame")
>dput(roomdata2)
结构(列表(房间 = 结构(1:3,.Label = c(“0M02A”,“0M03A”, "0M03B"), class= "因子"), 容量 = c(16L, 8L, 12L), Video.Conference = c(1L, 0L, 1L)), .Names = c("Room", "Capacity", "Video.Conference"), row.names = c(NA, -3L), class= "data.frame")
【问题讨论】:
-
你能把
dput(meetingtime2)和dput(roomdata2)的输出放在你的问题中吗?
标签: r loops nested-loops