1

定義

df<-read.table(textConnection('egg 1 20 a
                        egg 2 30 a
                        jap 3 50 b
                        jap 1 60 b'))

st

> df
   V1 V2 V3 V4
1 egg  1 20  a
2 egg  2 30  a
3 jap  3 50  b
4 jap  1 60  b

私のデータには因数がないため、因数を文字に変換します。

> df$V1 <- as.character(df$V1)
> df$V4 <- as.character(df$V4)  

V1を維持してデータフレームを「折りたたむ」ことを希望します:

  • V2の最大
  • V3の平均
  • V4 のモード (この値は実際には V1 グループ内では変更されないため、最初、最後なども変更される可能性があります。)

これは一般的な質問であることに注意してください。たとえば、私のデータセットははるかに大きく、折りたたむときにさまざまな関数 (さまざまな変数に対して last、first、min、max、variance、st.dev. など) を使用したい場合があります。したがって、関数の引数は非常に長くなる可能性があります。

この場合、次の形式の出力が必要です。

> df.collapse
   V1 V2 V3 V4
1 egg  2 25  a
2 jap  3 55  b
4

2 に答える 2

8

plyrパッケージはあなたを助けます:

library(plyr)
ddply(df, .(V1), summarize, V2 = max(V2), V3 = mean(V3), V4 = toupper(V4)[1])

Rにはモード機能がないので(たぶん)、他の機能を入れました。しかし、モード関数を実装するのは簡単です。

于 2011-06-28T17:24:11.500 に答える
5

ddply私はから使用することをお勧めしplyrます:

require(plyr)
ddply(df, .(V1), summarise, V2=max(V2), V3=mean(V3), V4=V4[1])

関数は任意の計算に置き換えることができます。V3列は数値ではないため、数値に変換してから最頻値を計算することをお勧めします。今のところ、各分割の最初の行のV3値を返しています。または、使用したくない場合plyr

do.call(rbind, lapply(split(df, df$V1), function(x) {
    data.frame(V2=max(x$V2), V3=mean(x$V3), V4=x$V4[1]))
})
于 2011-06-28T17:25:24.763 に答える