Использование R для чтения данных океанографического прибора - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть набор данных с инструмента, который разбит на 4 разных файла.3 отдельных файла скорости (X, Y, Z) и четвертый файл с меткой времени, объединяющий три других файла

3 файла скорости являются основными текстовыми файлами с расширениями, которые выглядят как

Data.V1 
Data.V2 
Data.V3

Файл отметки времени:

Data.sen

Файлы скорости для каждого измерения (X, Y и Z) измеряются в 25 бинах, поэтому данные для каждого из файлов .V выглядят следующим образом

  V1     V2    V3     V4     V5     V6     V7     V8     V9    V10    V11    V12    V13    V14    V15    V16
1  0.195  0.103 0.288 -0.034  0.340  0.337 -0.125  0.029 -0.099  0.269 -0.049  0.053  0.128 -0.069 -0.362  0.207
2 -0.113 -0.260 0.173 -0.135  0.279  0.057  0.163 -0.008 -0.025  0.206  0.014 -0.130 -0.180 -0.182  0.048 -0.144
3 -0.020 -0.138 0.033 -0.028 -0.095  0.200 -0.057 -0.205 -0.004 -0.078 -0.010  0.036 -0.084  0.384  0.186  0.109
4  0.225  0.159 0.026 -0.180 -0.015  0.420 -0.128  0.232  0.399  0.043 -0.027 -0.285 -0.431 -0.231 -0.272 -0.214
5  0.133 -0.179 0.211  0.221 -0.237 -0.164  0.665 -0.079 -0.294  0.137  0.087  0.121  0.075  0.068 -0.114 -0.216
6 -0.051 -0.098 0.060  0.282  0.185 -0.388  0.276  0.496  0.035  0.130 -0.094  0.179 -0.427 -0.109  0.238 -0.334
 V17    V18    V19   V20    V21    V22    V23    V24    V25
1  0.011  0.360  0.096 0.355 -0.084 -0.134  0.253  0.092  0.070
2 -0.093  0.016  0.048 0.159 -0.072  0.093 -0.227  0.005 -0.422
3  0.341  0.187 -0.206 0.172  0.198 -0.118 -0.103 -0.169  0.072
4  0.151 -0.142  0.014 0.049 -0.292  0.040 -0.068  0.079  0.062
5  0.255  0.272  0.026 0.230 -0.265 -0.333  0.397  0.011 -0.011
6 -0.101  0.159 -0.184 0.182 -0.080 -0.072 -0.178  0.038 -0.075

И файл отметки времени выглядит следующим образом

V1 V2   V3 V4 V5 V6 V7     V8   V9    V10   V11   V12   V13 V14   V15 V16   V17
1  1 30 2012 14  1  1  0 100000 11.4 1532.0 309.8   1.8  15.9   0 24.07   0 15320
2  1 30 2012 14  2  1  0 110101 11.3 1532.2  28.2  32.2 -16.0   0 24.12   0 15322
3  1 30 2012 14  3  1  0 111001 11.3 1533.1 205.2 -25.0 -32.9   0 24.51   0 15331
4  1 30 2012 14  4  1  0 110000 11.3 1534.2 181.9  -0.8  -5.2   0 24.94   0 15342
5  1 30 2012 14  5  1  0 110000 11.3 1535.5 183.4  -1.1  -0.1   0 25.49   0 15355
6  1 30 2012 14  6  1  0 110000 11.3 1536.8 171.6   0.1   7.5   0 26.00   0 15368

с первыми 6 столбцами данных: месяц, день, год, час, мин. Сек.

Я надеялся, что смогусделать три вещи с этими данными

1- Read all four data files into one file lined up by the time stamp
2- Apply a simple equation to the three different velocity measurements to arrive at final (the equation would be along the lines of sqrt(v1^2+v2^2+v3^3) )
3- Pull an hourly average of all the data

Я надеялся, что это будет просто, но весь код, который я пытался написать, ни к чему не привел.

Любая помощь по любому из трех шагов будет принята с благодарностью.

1 Ответ

3 голосов
/ 23 февраля 2012

Вы можете объединить 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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...