4

整数値と場合によってはNAを含むRのデータフレームの列を平均したいと思います。

CD6(Climate Division 6)と呼ばれるデータフレーム。NA値で初期化され、Climate Division 6に属するすべてのデータの平均値を格納します。行は日付で、列は0から23までの時間を表します。データフレームは次のようになります。

    > CD6

       Date       H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 ... H23
       1948-07-01 NA NA NA NA NA NA NA NA NA NA NA  ... NA
       1948-07-02 NA NA NA NA NA NA NA NA NA NA NA  ... NA
       1948-07-03 NA NA NA NA NA NA NA NA NA NA NA  ... NA

CAと呼ばれるデータフレームは、1から7までのすべての気候区分の真の値を持っています。データフレームは次のようになります。

    > CA

       Climate_Division  Date       H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 ... H23
       6                 1948-07-01 NA NA NA NA NA NA NA NA NA NA NA  ... NA
       5                 1948-07-01 0  1  1  3  0  0  0  0  0  0  0   ... 2
       6                 1948-07-01 0  1  1  3  0  0  0  0  0  0  0   ... 2
       6                 1948-07-01 1  0  0  5  7  0  1  1  1  0  0   ... 0
       6                 1948-07-02 0  2  1  2  1  1  NA 0  1  0  1  ... 2
       6                 1948-07-03 NA NA NA NA NA NA NA NA NA NA NA  ... NA

データフレームCAを行ごとに反復し、気候区分の正しいデータフレーム(この例では気候区分6のCD6)にマップするforループがコード化されています。問題は、それを適切に平均化するために、各気候区分に属する行がいくつあるかわからないことです。

CD6だけを見て、真の値が存在する場合はNAを無視し、最終的な答えが整数(値の上限)である特定の時間の各日付の平均を取得したいと思います。さまざまな気候区分のすべての時間がNAの値を持っている場合、0とは反対になるように維持したいと思います。CD6の最終結果は次のようになります。

    > CD6

       Date       H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 ... H23
       1948-07-01 1  1  1  4  4  0  1  1  1  0  0   ... 1
       1948-07-02 0  2  1  2  1  1  NA 0  1  0  1  ... 2
       1948-07-03 NA NA NA NA NA NA NA NA NA NA NA  ... NA

私はそれをコーディングして熟練させるためにこれをどうやって行うのか正確にはわかりません。だからどんな提案も役に立ち、あなたの時間をありがとう。

4

2 に答える 2

2

あなたが探しているのは、CAieClimate_Divisionと。の2つの列をグループ化することによる集約手段Dateです。組み込みaggregate関数を使用してそれを行うことができます。

> t <- 'Climate_Division  Date       H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10
+ 6                 1948-07-01 NA NA NA NA NA NA NA NA NA NA NA
+ 5                 1948-07-01 0  1  1  3  0  0  0  0  0  0  0 
+ 6                 1948-07-01 0  1  1  3  0  0  0  0  0  0  0 
+ 6                 1948-07-01 1  0  0  5  7  0  1  1  1  0  0 
+ 6                 1948-07-02 0  2  1  2  1  1  NA 0  1  0  1 
+ 6                 1948-07-03 NA NA NA NA NA NA NA NA NA NA NA'
> 
> CA <- read.table(textConnection(t), header=T)
> 
> CA
  Climate_Division       Date H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10
1                6 1948-07-01 NA NA NA NA NA NA NA NA NA NA  NA
2                5 1948-07-01  0  1  1  3  0  0  0  0  0  0   0
3                6 1948-07-01  0  1  1  3  0  0  0  0  0  0   0
4                6 1948-07-01  1  0  0  5  7  0  1  1  1  0   0
5                6 1948-07-02  0  2  1  2  1  1 NA  0  1  0   1
6                6 1948-07-03 NA NA NA NA NA NA NA NA NA NA  NA
> #Now that we have our data, we do aggregation of data and calculate mean over that using following command
> CAMeans <- aggregate(CA[,3:13], by =list(CA[,1], CA[,2]), FUN = mean, na.rm = TRUE)
> 
> CAMeans
  Group.1    Group.2  H0  H1  H2  H3  H4  H5  H6  H7  H8  H9 H10
1       5 1948-07-01 0.0 1.0 1.0   3 0.0   0 0.0 0.0 0.0   0   0
2       6 1948-07-01 0.5 0.5 0.5   4 3.5   0 0.5 0.5 0.5   0   0
3       6 1948-07-02 0.0 2.0 1.0   2 1.0   1 NaN 0.0 1.0   0   1
4       6 1948-07-03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
> 
> #Need to change the names of grouping column back to what they were before
> names(CAMeans)[1:2] <- c('Climate_Division', 'Date')
> 
> CAMeans
  Climate_Division       Date  H0  H1  H2  H3  H4  H5  H6  H7  H8  H9 H10
1                5 1948-07-01 0.0 1.0 1.0   3 0.0   0 0.0 0.0 0.0   0   0
2                6 1948-07-01 0.5 0.5 0.5   4 3.5   0 0.5 0.5 0.5   0   0
3                6 1948-07-02 0.0 2.0 1.0   2 1.0   1 NaN 0.0 1.0   0   1
4                6 1948-07-03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
> 
> #Now you can subset CAMeans to get content for CD6
> CD6 <- CAMeans[CAMeans$Climate_Division == 6, 2:ncol(CAMeans)]
> 
> CD6
        Date  H0  H1  H2  H3  H4  H5  H6  H7  H8  H9 H10
2 1948-07-01 0.5 0.5 0.5   4 3.5   0 0.5 0.5 0.5   0   0
3 1948-07-02 0.0 2.0 1.0   2 1.0   1 NaN 0.0 1.0   0   1
4 1948-07-03 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
于 2013-02-21T03:08:19.173 に答える
1

ここで何が欲しいかを推測するので、2つのオプションを与えました:rowMeans()colMeans()

CA <- read.table(
header=TRUE, text='Climate_Division  Date H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10  H23
6   1948-07-01 NA NA NA NA NA NA NA NA NA NA NA NA
5   1948-07-01 0  1  1  3  0  0  0  0  0  0  0 2
6   1948-07-01 0  1  1  3  0  0  0  0  0  0  0 2
6   1948-07-01 1  0  0  5  7  0  1  1  1  0  0 0
6   1948-07-02 0  2  1  2  1  1  NA 0  1  0  1 2
6   1948-07-03 NA NA NA NA NA NA NA NA NA NA NA NA')

CD6 <- data[CA$Climate_Division==6, ]   # Populating your data does not require a loop.

(CD6rmeans <- rowMeans(CD6[, -2], na.rm=TRUE))

#     1     3     4     5     6 
# 6.000 1.000 1.692 1.417 6.000 
t(CD6cmeans <- colMeans(CD6[ ,-2], na.rm=TRUE))

# Climate_Division     H0 H1     H2    H3    H4     H5  H6     H7     H8 H9    H10   H23
# [1,]           6 0.3333  1 0.6667 3.333 2.667 0.3333 0.5 0.3333 0.6667  0 0.3333 1.333
于 2013-02-21T02:43:12.317 に答える