4

私は非常に大きなデータセットを持っています、そしてそれは以下のように見えます: df <- data.frame(school=c("a", "a", "a", "b","b","c","c","c"), year=c(3,3,1,4,2,4,3,1), GPA=c(4,4,4,3,3,3,2,2))

school year GPA
  a    3   4
  a    3   4
  a    1   4
  b    4   3
  b    2   3
  c    4   3
  c    3   2
  c    1   2

そして私はそれを次のように見せたい:

school year GPA
 a    3   4
 a    3   4
 b    4   3
 c    4   3

ですから、基本的には、GPAに関係なく、各学校に1年生(学生)が欲しいのです。

私が試してみました:

new_df <- df[!duplicated(paste(df[,1],df[,2])),] しかし、これは私に学校と年の間のユニークな組み合わせを与えます。

下の学校は私にユニークな学校を与えてくれます new_df2 <- df[!duplicated(df$school),]

4

2 に答える 2

6

plyrライブラリの使用

require(plyr)
ddply(df,.(school),function(x){x[x$year==max(x$year),]})
> ddply(df,.(school),function(x){x[x$year==max(x$year),]})
  school year GPA
1      a    3   4
2      a    3   4
3      b    4   3
4      c    4   3

またはベース

test<-lapply(split(df,df$school),function(x){x[x$year==max(x$year),]})
out<-do.call(rbind,test)
> out
    school year GPA
a.1      a    3   4
a.2      a    3   4
b        b    4   3
c        c    4   3

説明: splitデータフレームを学校ごとのリストに分割します。

dat<-split(df,df$school)

> dat
$a
  school year GPA
1      a    3   4
2      a    3   4
3      a    1   4

$b
  school year GPA
4      b    4   3
5      b    2   3

$c
  school year GPA
6      c    4   3
7      c    3   2
8      c    1   2

各学校について、最上位のメンバーが必要です。

dum.fun<-function(x){x[x$year==max(x$year),]}

> dum.fun(dat$a)
  school year GPA
1      a    3   4
2      a    3   4

lapplyリストのメンバーに関数を適用し、リストを出力します

> lapply(split(df,df$school),function(x){x[x$year==max(x$year),]})
$a
  school year GPA
1      a    3   4
2      a    3   4

$b
  school year GPA
4      b    4   3

$c
  school year GPA
6      c    4   3

これは私たちが望むものですが、リスト形式です。リストのメンバーをまとめてバインドする必要があります。これを行うにはrbind、 を使用してメンバーを連続して呼び出しdo.callます。

于 2012-08-14T01:25:44.113 に答える
5

私は、この種のことについてのby声明 ( を参照) のファンです。に基づいてグループに分割され、次に を表す各学校の行が返されます。?bydfdf$schoolmax(year)

> by(df,df$school,function(x) x[x$year==max(x$year),])
df$school: a
  school year GPA
1      a    3   4
2      a    3   4
------------------------------------------------------------ 
df$school: b
  school year GPA
4      b    4   3
------------------------------------------------------------ 
df$school: c
  school year GPA
6      c    4   3

do.call(rbind...byステートメントから返された各学校の結果を結合するだけです。

do.call(rbind,by(df,df$school,function(x) x[x$year==max(x$year),]))

    school year GPA
a.1      a    3   4
a.2      a    3   4
b        b    4   3
c        c    4   3
于 2012-08-14T02:23:49.357 に答える