2017-08-05 1 views
1

各xとyに対して毎日(6時間ごとに)4回観測する毎日の時間系列のデータフレームがあります(202552個のセル)。すべてのn列を平均化し、新しいdata.frameの最初の2つの列をrに保持する

> head(tab,10) 
     x y X1990.05.01.01.00.00 X1990.05.01.07.00.00 X1990.05.01.13.00.00 X1990.05.01.19.00.00 X1990.05.02.01.00.00 X1990.05.02.07.00.00 X1990.05.02.13.00.00 
1 5.000 60    276.9105    277.8516    278.9908    279.2422    279.6751    279.8078    280.4396 
2 5.125 60    276.8863    277.8682    278.9966    279.2543    279.6863    279.7885    280.4033 
3 5.250 60    276.8621    277.8830    279.0006    279.2659    279.6989    279.7688    280.3661 
4 5.375 60    276.8379    277.8969    279.0029    279.2772    279.7123    279.7477    280.3289 
5 5.500 60    276.8142    277.9094    279.0033    279.2879    279.7257    279.7244    280.2909 
6 5.625 60    276.7913    277.9224    279.0033    279.2987    279.7396    279.6993    280.2523 
7 5.750 60    276.7707    277.9363    279.0020    279.3094    279.7531    279.6715    280.2142 
8 5.875 60    276.7537    277.9520    279.0002    279.3202    279.7656    279.6406    280.1770 
9 6.000 60    276.7416    277.9713    278.9980    279.3314    279.7773    279.6070    280.1407 
10 6.125 60    276.7357    277.9946    278.9953    279.3435    279.7871    279.5707    280.1071 
    X1990.05.02.19.00.00 X1990.05.03.01.00.00 X1990.05.03.07.00.00 X1990.05.03.13.00.00 X1990.05.03.19.00.00 X1990.05.04.01.00.00 X1990.05.04.07.00.00 
1    280.5674    280.3316    280.3796    280.2308    280.6216    280.6216    280.1842 
2    280.5414    280.3106    280.3697    280.2133    280.6220    280.6368    280.2053 
3    280.5145    280.2886    280.3594    280.1927    280.6184    280.6503    280.2227 
4    280.4858    280.2653    280.3482    280.1703    280.6113    280.6619    280.2380 
5    280.4562    280.2420    280.3379    280.1466    280.6010    280.6722    280.2492 
6    280.4262    280.2192    280.3280    280.1219    280.5880    280.6816    280.2572 
7    280.3957    280.1981    280.3209    280.0973    280.5732    280.6910    280.2613 
8    280.3661    280.1793    280.3159    280.0748    280.5571    280.7009    280.2626 
9    280.3384    280.1640    280.3155    280.0542    280.5414    280.7112    280.2599 
10    280.3128    280.1542    280.3195    280.0385    280.5270 

私は4列ごとに1日平均を計算したいと思います(毎日4回測定)。私はこの関数を使用することができましたが、各行にxとyを保持する必要があります。

### daily mean 
byapply <- function(x, by, fun, ...) 
{ 
    # Create index list 
    if (length(by) == 1) 
    { 
    nc <- ncol(x) 
    split.index <- rep(1:ceiling(nc/by), each = by, length.out = nc) 
    } else # 'by' is a vector of groups 
    { 
    nc <- length(by) 
    split.index <- by 
    } 
    index.list <- split(seq(from = 1, to = nc), split.index) 

    # Pass index list to fun using sapply() and return object 
    sapply(index.list, function(i) 
    { 
    do.call(fun, list(x[, i], ...)) 
    }) 
} 


DM<- data.frame(byapply(tab[3:2800], 4, rowMeans)) 
> head(DM, 10) 
     X1  X2  X3  X4  X5 
1 278.2488 280.1225 280.3909 279.4138 276.6809 
2 278.2514 280.1049 280.3789 279.4395 276.7141 
3 278.2529 280.0871 280.3648 279.4634 276.7437 
4 278.2537 280.0687 280.3488 279.4858 276.7691 
5 278.2537 280.0493 280.3319 279.5066 276.7909 
6 278.2539 280.0294 280.3143 279.5264 276.8090 
7 278.2546 280.0086 280.2974 279.5453 276.8244 
8 278.2565 279.9873 280.2818 279.5639 276.8377 
9 278.2605 279.9658 280.2688 279.5819 276.8495 
10 278.2673 279.9444 280.2598 279.5998 276.8611 

それから私は(私は最初の2つの列を維持することにより、毎日平均を直接計算することができる方法を探していますそれぞれxとy

lonlat<-tab[-(3:2800)] 
DMxy<- data.frame(cbind(lonlat, DM)) 

しかし、毎日手段を連結するcbindを使用することができますxおよびy)はxとyを削除せずに新たなデータフレーム()でcobind

答えて

0

代わりの

DM<- data.frame(byapply(tab[3:2800], 4, rowMeans)) 
に任意の可能なエラーを最小化するために

単一のステップであなたの望ましい結果を得るでしょう

DM2 <- cbind(byapply(tab[-(1:2)], 4, rowMeans), tab[1:2]) 

を試してみてください。また、データフレームの長さを知る必要がないため、間違いの可能性を最小限に抑えます。 tab[-(1:2)]は、「最初の2つを除くtabのすべての列」を意味します。

+0

は股関節をありがとう私にステップを保存しないでください – Ali

0

グループ化された集約、具体的には平均化などの操作が必要なため、データをワイドフォーマットで保存しない古典的な教科書のケース。

DATA(OPのポストされた例が、不足している行に10個の最後の2つの値を埋め):長い形式にデータを溶融し、集計日までに各XYグループ化のために考えてみましょう

txt= ' x y X1990.05.01.01.00.00 X1990.05.01.07.00.00 X1990.05.01.13.00.00 X1990.05.01.19.00.00 X1990.05.02.01.00.00 X1990.05.02.07.00.00 X1990.05.02.13.00.00 X1990.05.02.19.00.00 X1990.05.03.01.00.00 X1990.05.03.07.00.00 X1990.05.03.13.00.00 X1990.05.03.19.00.00 X1990.05.04.01.00.00 X1990.05.04.07.00.00 1 5.000 60 276.9105 277.8516 278.9908 279.2422 279.6751 279.8078 280.4396 280.5674 280.3316 280.3796 280.2308 280.6216 280.6216 280.1842 2 5.125 60 276.8863 277.8682 278.9966 279.2543 279.6863 279.7885 280.4033 280.5414 280.3106 280.3697 280.2133 280.6220 280.6368 280.2053 3 5.250 60 276.8621 277.8830 279.0006 279.2659 279.6989 279.7688 280.3661 280.5145 280.2886 280.3594 280.1927 280.6184 280.6503 280.2227 4 5.375 60 276.8379 277.8969 279.0029 279.2772 279.7123 279.7477 280.3289 280.4858 280.2653 280.3482 280.1703 280.6113 280.6619 280.2380 5 5.500 60 276.8142 277.9094 279.0033 279.2879 279.7257 279.7244 280.2909 280.4562 280.2420 280.3379 280.1466 280.6010 280.6722 280.2492 6 5.625 60 276.7913 277.9224 279.0033 279.2987 279.7396 279.6993 280.2523 280.4262 280.2192 280.3280 280.1219 280.5880 280.6816 280.2572 7 5.750 60 276.7707 277.9363 279.0020 279.3094 279.7531 279.6715 280.2142 280.3957 280.1981 280.3209 280.0973 280.5732 280.6910 280.2613 8 5.875 60 276.7537 277.9520 279.0002 279.3202 279.7656 279.6406 280.1770 280.3661 280.1793 280.3159 280.0748 280.5571 280.7009 280.2626 9 6.000 60 276.7416 277.9713 278.9980 279.3314 279.7773 279.6070 280.1407 280.3384 280.1640 280.3155 280.0542 280.5414 280.7112 280.2599 10 6.125 60 276.7357 277.9946 278.9953 279.3435 279.7871 279.5707 280.1071 280.3128 280.1542 280.3195 280.0385 280.5270 280.6581 280.3139' df <- read.table(text=txt, header=TRUE) 

CODE

library(reshape2) 

mdf <- melt(df, id.vars = c('x', 'y'), variable.name = "day") 

mdf$day <- gsub("X", "", mdf$day) 
mdf$datetime <- as.POSIXct(mdf$day, format="%Y.%m.%d.%H.%M.%S") 
mdf$day <- format(mdf$datetime, "%Y-%m-%d") 
head(mdf) 
#  x y  day value   datetime 
# 1 5.000 60 1990-05-01 276.9105 1990-05-01 01:00:00 
# 2 5.125 60 1990-05-01 276.8863 1990-05-01 01:00:00 
# 3 5.250 60 1990-05-01 276.8621 1990-05-01 01:00:00 
# 4 5.375 60 1990-05-01 276.8379 1990-05-01 01:00:00 
# 5 5.500 60 1990-05-01 276.8142 1990-05-01 01:00:00 
# 6 5.625 60 1990-05-01 276.7913 1990-05-01 01:00:00 

aggdf <- aggregate(value ~ x + y + day, mdf, FUN=mean) 
aggdf <- with(aggdf, aggdf[order(x,y),])  # RE-ORDER BY X 
row.names(aggdf) <- NULL      # RESET ROW NAMES 

head(aggdf, 12) 
#  x y  day value 
# 1 5.000 60 1990-05-01 278.2488 
# 2 5.000 60 1990-05-02 280.1225 
# 3 5.000 60 1990-05-03 280.3909 
# 4 5.000 60 1990-05-04 280.4029 
# 5 5.125 60 1990-05-01 278.2514 
# 6 5.125 60 1990-05-02 280.1049 
# 7 5.125 60 1990-05-03 280.3789 
# 8 5.125 60 1990-05-04 280.4211 
# 9 5.250 60 1990-05-01 278.2529 
# 10 5.250 60 1990-05-02 280.0871 
# 11 5.250 60 1990-05-03 280.3648 
# 12 5.250 60 1990-05-04 280.4365 
+0

ありがとうございます。しかし、それは非常に遅い、最初の150日間実行するために約10分かかった、私はまだ4350日を残している。スピードアップの方法はありますか? – Ali

+0

あなたの* byapply *と一緒にどれくらい早く行きましたか?どの部分が遅れますか?「溶融」、「凝集」?実際のデータの量はどれくらいですか? – Parfait

関連する問題