Вы можете объединить data.frames с cbind
или merge
,
но может быть легче сначала нормализовать их (т.е. преобразовать
их в "высокий" формат) с melt
.
# Sample data
n <- 10
k <- 25
d1 <- as.data.frame( matrix( rnorm(n*k), nc=k ) )
d2 <- as.data.frame( matrix( rnorm(n*k), nc=k ) )
d3 <- as.data.frame( matrix( rnorm(n*k), nc=k ) )
d4 <- seq(ISOdatetime(2012, 1, 1, 0, 0, 0, "UTC"), length=n, by="15 min")
f <- function(u) sapply(
c("%Y", "%m", "%d", "%H", "%M", "%S"),
function(x) as.numeric(format(u,x))
)
d4 <- t(sapply(d4, f))
d4 <- cbind( d4, matrix( rnorm(n*(k-6)), nr=n ) )
d4 <- as.data.frame(d4)
# Add column names
names(d1) <- names(d2) <- names(d3) <- paste("V", seq_len(ncol(d1)), sep="")
names(d4) <- paste("W", seq_len(ncol(d4)), sep="")
names(d4)[1:6] <- c("Year", "Month", "Day", "Hour", "Minute", "Second")
# Add an identifier column
d1$id <- d2$id <- d3$id <- d4$id <- seq_len(nrow(d1))
d1$var <- "X"
d2$var <- "Y"
d3$var <- "Z"
# Clean the timestamp
d4$time <- ISOdatetime( d4$Year, d4$Month, d4$Day, d4$Hour, d4$Minute, d4$Second, "UTC" )
# Normalize each data.frame
library(reshape2)
d1 <- melt(d1, id.vars=c("id","var"), variable.name="Position" )
d2 <- melt(d2, id.vars=c("id","var"), variable.name="Position" )
d3 <- melt(d3, id.vars=c("id","var"), variable.name="Position" )
# Concatenate them
d <- rbind(d1, d2, d3)
# Add the time data
d <- merge( d, d4, by="id" )
Когда все в одном data.frame,
Вы можете объединить данные с ddply
и, если необходимо, измените его с помощью dcast
.
# Aggregate
d <- dcast(d, id + Position + time + Year + Month + Day + Hour + Minute + Second ~ var )
d$velocity <- sqrt( d$X^2 + d$Y^2 + d$Z^2 )
library(plyr)
r <- ddply( d,
c("Position", "Year", "Month", "Day", "Hour"),
summarize, value=mean(velocity)
)
dcast(r, Year + Month + Day + Hour ~ Position )