11

特定の行 (ここでは年) の 1 つの列 (ここではスコア) の平均を取得する必要があります。具体的には、3 期間の平均スコアを知りたいです。

  • 期間 1: 年 <= 1983
  • 期間 2: 年 >= 1984 & 年 <= 1990
  • 期間 3: 年 >= 1991

これは私のデータの構造です:

  country year     score        
 Algeria 1980     -1.1201501 
 Algeria 1981     -1.0526943 
 Algeria 1982     -1.0561565 
 Algeria 1983     -1.1274560 
 Algeria 1984     -1.1353926 
 Algeria 1985     -1.1734330 
 Algeria 1986     -1.1327666 
 Algeria 1987     -1.1263586 
 Algeria 1988     -0.8529455 
 Algeria 1989     -0.2930265 
 Algeria 1990     -0.1564207 
 Algeria 1991     -0.1526328 
 Algeria 1992     -0.9757842 
 Algeria 1993     -0.9714060 
 Algeria 1994     -1.1422258 
 Algeria 1995     -0.3675797 
 ...

計算された平均値は、追加の列 (「平均」) の df に追加する必要があります。つまり、期間 1 の年の同じ平均値、期間 2 の年の平均値などです。

これは次のようになります。

country year     score         mean   
 Algeria 1980     -1.1201501     -1.089
 Algeria 1981     -1.0526943     -1.089
 Algeria 1982     -1.0561565     -1.089
 Algeria 1983     -1.1274560     -1.089
 Algeria 1984     -1.1353926     -0.839
 Algeria 1985     -1.1734330     -0.839
 Algeria 1986     -1.1327666     -0.839
 Algeria 1987     -1.1263586     -0.839
 Algeria 1988     -0.8529455     -0.839
 Algeria 1989     -0.2930265     -0.839
 Algeria 1990     -0.1564207     -0.839
 ...

私が試したすべての可能なパスは、簡単に非常に複雑になりました-そして、90か国以上のさまざまな期間の平均スコアを計算する必要があります...

あなたの助けに感謝します!

4

3 に答える 3

17
datfrm$mean <-
  with (datfrm, ave( score, findInterval(year, c(-Inf, 1984, 1991, Inf)), FUN= mean) )

タイトルの質問は実際の質問とは少し異なり、論理インデックスを使用して回答されます。特定のサブセットの平均のみが必要な場合は、次のyear >= 1984 & year <= 1990方法で実行できます。

mn84_90 <- with(datfrm, mean(score[year >= 1984 & year <= 1990]) )
于 2012-09-12T18:44:32.477 に答える
6

(あなたの例のように)ソートfindIntervalする必要があるので、ソートされていない場合に使用しyearcutたくなるでしょう[間違っていることが証明されました、@DWinに感謝します]。完全を期すために、data.table同等のもの(大規模データのスケール)は次のとおりです。

require(data.table)
DT = as.data.table(DF)   # or just start with a data.table in the first place

DT[, mean:=mean(score), by=cut(year,c(-Inf,1984,1991,Inf))]

またはfindInterval、DWin が使用されるほど高速である可能性があります。

DT[, mean:=mean(score), by=findInterval(year,c(-Inf,1984,1991,Inf))]
于 2012-09-12T19:01:40.973 に答える