1

データフレームがあるとしましょう

df <- data.frame('A' = c('a','a','a','a','b','b','b','b','b'),
                 'B' = c('y','y','z','z','y','y','y','z','z'),
                 'value'=c(1  , 2 , 2 , 3 , 2 , 3 , 1 , 2 , 2))

だからこのように見えた

 A B value  
 a y     1  
 a y     2  
 a z     2  
 a z     3  
 b y     2  
 b y     3  
 b y     1   
 b z     2   
 b z     2  

クエリを使用して、A と B の各サブセットの平均を取得できました

with(df, aggregate(df, by = list(A, B), FUN = mean))

少し操作した後、

A B value  
a y   1.5  
b y   2.0  
a z   2.5  
b z   2.0  

これを行う方法はありますが、各サブセットの最大 x 値の平均のみを計算します。したがって、この例で x を 2 とすると、合計 2 つのエントリしかないサブセット ay、az、および bz の平均は変化しません (したがって、上位の x エントリはサブセットのデータセット全体です)。ただし、by には 3 つのエントリがあるため、出力テーブルが次のようになるように、最も高い 2 つの値 (2 と 3) の平均を返す必要があります。

A B value  
a y   1.5  
b y   2.5  
a z   2.5  
b z   2.0  
4

3 に答える 3

2

aggregate次のように、数式インターフェイスを に使用する方が簡単だと思います。

元のバージョン:

aggregate(value~A+B, data=df, FUN = mean)
  A B value
1 a y   1.5
2 b y   2.0
3 a z   2.5
4 b z   2.0

ソートされた値の末尾の平均を計算する無名関数を使用して、目的のバージョンを取得できます。

aggregate(value~A+B, data=df, FUN = function(x)mean(tail(sort(x), 2)))
  A B value
1 a y   1.5
2 b y   2.5
3 a z   2.5
4 b z   2.0
于 2012-06-07T16:08:13.800 に答える
2

同じもののバージョンへ:

lapply(split(df, list(df$A, df$B)),
       function(x) mean(x[order(x$value, decreasing = TRUE), ][1:2, "value"]))

また

sapply(split(df, list(df$A, df$B)),
       function(x) mean(x[order(x$value, decreasing = TRUE), ][1:2, "value"]))

望ましい結果を与える:

> lapply(split(df, list(df$A, df$B),
+        function(x) mean(x[order(x$value, decreasing = TRUE), ][1:2, "value"]))
$a.y
[1] 1.5

$b.y
[1] 2.5

$a.z
[1] 2.5

$b.z
[1] 2

> sapply(split(df, list(df$A, df$B)),
+        function(x) mean(x[order(x$value, decreasing = TRUE), ][1:2, "value"]))
a.y b.y a.z b.z 
1.5 2.5 2.5 2.0

実際のアプリケーションでは、無名関数を適切な関数にして、各サブセットの行数が 2 未満の場合に堅牢にすることができます。それは読者の演習として残されています。

私が示した無名関数 (または非常に類似した関数) は、次のように簡単に使用できますaggregate()

aggregate(value ~ A + B, data = df,
          FUN = function(x) mean(x[order(x, decreasing = TRUE)][1:2]))

例えば:

> aggregate(value ~ A + B, data = df,
+           FUN = function(x) mean(x[order(x, decreasing = TRUE)][1:2]))
  A B value
1 a y   1.5
2 b y   2.5
3 a z   2.5
4 b z   2.0

しかし、私は昔ながらで、これらのことを手作業で行うことがよくあります。

于 2012-06-07T16:10:39.367 に答える
0

これは役に立ちますか?

x <- 2
with(df, aggregate(df, by = list(A, B), FUN = function(x)
                                                 mean(x[1:x])))
于 2012-06-07T16:06:10.667 に答える