Извеждане на вложен цикъл към data.frame

Имам два набора от данни в 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.

Желаният резултат е таблица като точно по-горе, но вместо това рамка с данни с всяка стойност в отделна колона (всяка дата и час, зададени заедно в една колона).

Разгледах lists, lapply, foreach, но просто не мога да си обясня решението. Всяка помощ ще бъде оценена, аз съм начинаещ, така че имам желание да се науча.

Наздраве * на dputs

>dput(meetingtime2)

структура(списък(ST = структура(1:5, .Етикет = 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"), клас = "фактор")), .Names = c("ST", "ET"), row.names = c(NA, -5L), class = "data.frame")

>dput(roomdata2)

структура(списък(Стая = структура(1:3, .Етикет = c("0M02A", "0M03A", "0M03B"), клас = "фактор"), Капацитет = c(16L, 8L, 12L), Видео. Конференция = c(1L, 0L, 1L)), .Names = c("Стая", "Капацитет", "Video.Conference"), row.names = c(NA, -3L), class = "data.frame ")


person Nic    schedule 13.01.2015    source източник
comment
Можете ли да поставите резултатите от dput(meetingtime2) и dput(roomdata2) във вашия въпрос?   -  person Marat Talipov    schedule 13.01.2015


Отговори (2)


Използване на вашите данни:

meetingtime2 <- read.csv(text = "ST,ET
2014-12-22 07:00:00,2014-12-22 07:30:00
2014-12-22 07:30:00,2014-12-22 08:00:00
2014-12-22 08:00:00,2014-12-22 08:30:00
2014-12-22 08:30:00,2014-12-22 09:00:00
2014-12-22 09:00:00,2014-12-22 09:30:00")

roomdata2 <- read.csv(text = "Room,Capacity,Video_Conference
0M02A,16,1
0M03A,8,0
0M03B,12,1")

След това merge лесно връща декартовия продукт, тъй като нито една от колоните не съвпада.

merge(meetingtime2, roomdata2)[, c(3:5, 1:2)]

##     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
person nacnudus    schedule 13.01.2015
comment
Резултатите обаче може да не са подредени по начина, предвиден от ОП. - person Avraham; 13.01.2015
comment
Това е фантастично просто, никога не бих го познал. Работи перфектно - person Nic; 13.01.2015

Това е грозно, но трябва да свърши работата. Предвид следните данни:

ST <- c('2014-12-22 07:00:00', '2014-12-22 07:30:00', '2014-12-22 08:00:00', '2014-12-22 08:30:00', '2014-12-22 09:00:00')
ET <- c('2014-12-22 07:30:00', '2014-12-22 08:00:00', '2014-12-22 08:30:00', '2014-12-22 09:00:00', '2014-12-22 09:30:00')

RoomName <- c('0M02A', '0M03A', '0M03B')
Capacity <- c(16, 8, 12)
VideoCap <- c(1, 0, 1)

Times <- data.frame(ST, ET, stringsAsFactors = FALSE)
Rooms <- data.frame(RoomName, Capacity, VideoCap,stringsAsFactors = FALSE)

функцията по-долу трябва да прави това, което искате:

Smash <- function(DF1, DF2){
  nm <- dim(DF1)
  pq <- dim(DF2)    
  maxrow <- nm[[1]] * pq[[1]]
  maxcol <- nm[[2]] + pq[[2]]
  MAT <- matrix('A', nrow = maxrow, ncol = maxcol)
  currow <- 1
    for (i1 in seq_len(nm[[1]])) {
      for (i2 in seq_len(pq[[1]])) {
        curcol <- 1
        for (j in seq_len(nm[[2]])) {
          MAT[currow, curcol] <- DF1[i1, j]
          curcol <- curcol + 1
        }
        for (j in seq_len(pq[[2]])) {
          MAT[currow, curcol] <- DF2[i2, j]
          curcol <- curcol + 1
        }
        currow <- currow + 1
      }
    }
  DF <- data.frame(MAT)
  names(DF) <- c(names(DF1), names(DF2))
  return(DF)
}

Smash(Rooms, Times) връща:

> Smash(Rooms, Times)
   RoomName Capacity VideoCap                  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        8        0 2014-12-22 07:00:00 2014-12-22 07:30:00
7     0M03A        8        0 2014-12-22 07:30:00 2014-12-22 08:00:00
8     0M03A        8        0 2014-12-22 08:00:00 2014-12-22 08:30:00
9     0M03A        8        0 2014-12-22 08:30:00 2014-12-22 09:00:00
10    0M03A        8        0 2014-12-22 09:00:00 2014-12-22 09:30:00
11    0M03B       12        1 2014-12-22 07:00:00 2014-12-22 07:30:00
12    0M03B       12        1 2014-12-22 07:30:00 2014-12-22 08:00:00
13    0M03B       12        1 2014-12-22 08:00:00 2014-12-22 08:30:00
14    0M03B       12        1 2014-12-22 08:30:00 2014-12-22 09:00:00
15    0M03B       12        1 2014-12-22 09:00:00 2014-12-22 09:30:00
person Avraham    schedule 13.01.2015
comment
Ще изпробвам това, може да е по-здраво от декартово произведение - person Nic; 13.01.2015