2

私はRを初めて使用します。時間の断面である、1つの主要な変数を持つ比較パネルデータセットを使用しているため、その期間のすべての変数を平均化する必要があります。

データの形式は次のとおりです。行は国の観測値、列は可変年です。

私はこの例を作成しました:

cname<- c("ARGENTINA", "BOLIVIA", "CHILE", "CHINA", "ECUADOR", "EGYPT")
gdp2003<- c(1.5, 2.3, 5.2, 12, 2.3, 3.3)
gdp2004<- c(1.7, 2.2, 4.7, 13.3, 1.7, 1.5)
corrupt2003<- c(5.1, 6.7, 3.4, 5.5, 4.5, 8.7)
corrupt2004<- c(4.5, 5.4, 2.4, 4.5, 5.4, 8.9)
df<- data.frame(cbind(cname, gdp2003, gdp2004, corrupt2003, corrupt2004))
df

これはこの出力を生成します:

     cname gdp2003 gdp2004 corrupt2003 corrupt2004
1 ARGENTINA     1.5     1.7         5.1         4.5
2   BOLIVIA     2.3     2.2         6.7         5.4
3     CHILE     5.2     4.7         3.4         2.4
4     CHINA      12    13.3         5.5         4.5
5   ECUADOR     2.3     1.7         4.5         5.4
6     EGYPT     3.3     1.5         8.7         8.9

次のように、国別の列変数を平均化できる関数を作成したいと思います。

       cname gdp2003 gdp2004 corrupt2003 corrupt2004 new.col.gdp new.col.corrupt
1 ARGENTINA     1.5     1.7         5.1         4.5         1.6             4.8
2   BOLIVIA     2.3     2.2         6.7         5.4        2.25            6.05
3     CHILE     5.2     4.7         3.4         2.4        4.95             2.9
4     CHINA      12    13.3         5.5         4.5       12.65               5
5   ECUADOR     2.3     1.7         4.5         5.4           2            4.95
6     EGYPT     3.3     1.5         8.7         8.9         2.4             8.8

どんな助けでもいただければ幸いです。

4

3 に答える 3

3

まず、データフレームを作成するコマンドを変更する必要があります。cbind()を使用して、すべての数値列をテキストに変換しました(textであるcname列と一致します。次にRは、data.frameを作成したときに、これらのテキスト列を係数に変換しました。また、data.frame名をDFに変更します。関数df()との競合を回避します。

DF<- data.frame(cname, gdp2003, gdp2004, corrupt2003, corrupt2004)
vars <-c("gdp","corrupt")
new.cols <- sapply(vars, function(i) rowMeans(DF[, grepl(i, colnames(DF))]))
colnames(new.cols) <- paste0(colnames(new.cols), ".mean")
DF <- data.frame(DF, new.cols)
DF
于 2012-08-07T01:58:01.983 に答える
2

一部の列で使用rowMeansできます

df$new.col.gdp <- rowMeans(df[,2:3])
df$new.col.corrupt <- rowMeans(df[,3:4])

ここで、必要なすべての列を番号で実際に知っているわけではないが、名前に共通するものがすべて含まれていることを知っているとします。'gdp'だとしましょう。あなたはのようなものを使うことができます。

selectColumns <- grep('gdp', names(df))
df$new.col.gdp <- rowMeans(df[,selectColumns])
于 2012-08-07T01:33:44.110 に答える
2

これまでに提供されたソリューションは確かに機能しますが、データを別の方法で構造化することをお勧めします。ここでは、データとフィールド名を組み合わせています。「gdp2003」というフィールドを使用するのではなく、「gdp」というフィールドと「year」という別のフィールドを作成してから、年が 2003 である gdp のレコードを作成する必要があります。このアプローチの詳細については、Hadley Wickham の論文Tidy Dataを読むことを強くお勧めします。

このようにデータを設定するためにアプローチを変更する方法は次のとおりです。

df <- data.frame(country=cname, year=2003, gdp=gdp2003,
                 corrupt=corrupt2003)
df <- rbind(df, data.frame(country=cname, year=2004,
                 gdp=gdp2004, corrupt=corrupt2004))

データ フレームは次のようになります。

     country year  gdp corrupt
1  ARGENTINA 2003  1.5     5.1
2    BOLIVIA 2003  2.3     6.7
3      CHILE 2003  5.2     3.4
4      CHINA 2003 12.0     5.5
5    ECUADOR 2003  2.3     4.5
6      EGYPT 2003  3.3     8.7
7  ARGENTINA 2004  1.7     4.5
8    BOLIVIA 2004  2.2     5.4
9      CHILE 2004  4.7     2.4
10     CHINA 2004 13.3     4.5
11   ECUADOR 2004  1.7     5.4
12     EGYPT 2004  1.5     8.9

この形式では、後でデータを追加するのがはるかに簡単で、コードを使用して平均を計算することができます。これを行う 1 つの方法は、次を使用することbyです。

by(df[,-(1:2)], df$country, colMeans)

これにより、平均のリストが表示されます。

df$country: ARGENTINA
    gdp corrupt 
    1.6     4.8 
------------------------------------------------------------ 
df$country: BOLIVIA
    gdp corrupt 
   2.25    6.05 

[etc]

次のように、これをより適切なテーブルに戻すことができます。

t(simplify2array(by(df[,-(1:2)], df$country, colMeans)))

            gdp corrupt
ARGENTINA  1.60    4.80
BOLIVIA    2.25    6.05
CHILE      4.95    2.90
CHINA     12.65    5.00
ECUADOR    2.00    4.95
EGYPT      2.40    8.80

整理されたデータを扱う際の柔軟性をさらに高めるには、plyrパッケージをご覧ください。

ddply(df, .(country), summarise, gdp=mean(gdp), corrupt=mean(corrupt))

平均値と元の結果が必要な場合 (たとえば、各年の平均値との差を計算する場合):

ddply(df, .(country), transform, gdp.m=mean(gdp), corrupt.m=mean(corrupt))

      country year  gdp corrupt gdp.m corrupt.m
1  ARGENTINA 2003  1.5     5.1  1.60      4.80
2  ARGENTINA 2004  1.7     4.5  1.60      4.80
3    BOLIVIA 2003  2.3     6.7  2.25      6.05
4    BOLIVIA 2004  2.2     5.4  2.25      6.05
5      CHILE 2003  5.2     3.4  4.95      2.90
6      CHILE 2004  4.7     2.4  4.95      2.90
7      CHINA 2003 12.0     5.5 12.65      5.00
8      CHINA 2004 13.3     4.5 12.65      5.00
9    ECUADOR 2003  2.3     4.5  2.00      4.95
10   ECUADOR 2004  1.7     5.4  2.00      4.95
11     EGYPT 2003  3.3     8.7  2.40      8.80
12     EGYPT 2004  1.5     8.9  2.40      8.80
于 2012-08-07T10:09:49.240 に答える