1

次のようなデータフレームがあります。

Reach Chem HQ 
a Mercury 1.12
a Nickel  1.65
b Mercury 1.54
b Nickel 2.34
b Cadmium 3.12
c Mercury 2.12
c Nickel 2.34

Reach最高のそれぞれのレコードのみを保持することでデータフレームを削除したいので、次のようにHQなります。

 Reach Chem HQ 
 a Nickel  1.65
 b Cadmium 3.12
 c Nickel 2.34

これを行うための最良の方法は何ですか?

4

4 に答える 4

4

これがベースRのワンライナー(またはそれに近い)メソッドです。

データを取得します。

test <- read.table(textConnection("Reach Chem HQ 
a Mercury 1.12
a Nickel  1.65
b Mercury 1.54
b Nickel 2.34
b Cadmium 3.12
c Mercury 2.12
c Nickel 2.34"),header=TRUE)

使用Reach率が最も高い各グループの行を返します 。Theは、識別された行を1つのデータセットに結合します。HQbywhich.maxdo.call(rbind...

do.call(rbind,by(test,test$Reach,function(x) x[which.max(x$HQ),]))

結果:

  Reach    Chem   HQ
a     a  Nickel 1.65
b     b Cadmium 3.12
c     c  Nickel 2.34

編集-最大値に同点があるかどうかに関する以下のmindless.pandaとjoranの議論に対処するために、これは機能します:

do.call(rbind,by(test,test$Reach,function(x) x[x$HQ==max(x$HQ),]))
于 2012-07-27T06:21:36.537 に答える
3

おそらく、次のように?orderと?duplicatedを使用してみることができます。

my_df = data.frame(
    Reach = c("a","a","b","b","b","c","c"), 
    Chem = c("Mercury","Nickel","Mercury","Nickel","Cadmium","Mercury","Nickel"),
    HQ = c(1.12,1.65,1.54,2.34,3.12,2.12,2.34)
    )

my_df = my_df[order(my_df$HQ,decreasing=TRUE),]
my_df = my_df[!duplicated(my_df$Reach),]
my_df = my_df[order(my_df$Reach),]

編集:わかりやすくするために、結果を以下に示します。

  Reach    Chem   HQ
2     a  Nickel 1.65
5     b Cadmium 3.12
7     c  Nickel 2.34
于 2012-07-27T00:41:43.223 に答える
3

あなたがplyr方法が好きなら:

data <- read.table(text="Reach Chem HQ 
a Mercury 1.12
a Nickel  1.65
b Mercury 1.54
b Nickel 2.34
b Cadmium 3.12
c Mercury 2.12
c Nickel 2.34", header=TRUE)

require(plyr)
ddply(data, .(Reach), summarize, Chem=Chem[which.max(HQ)], MaxHQ=max(HQ))

  Reach    Chem  MaxHQ
1     a  Nickel   1.65
2     b Cadmium   3.12
3     c  Nickel   2.34

編集:

この同様の質問に一部動機付けられ、タイプ列が複数ありChem(列がサブセット化されていない)、Chem=Chem[which.max(HQ)]各列の複製が冗長になる場合を考えて、これを思いつきました。これを行うためのより良い方法があるかどうか、plyrウィザードが検討できるかどうか知りたいです。

# add the within-group max HQ as a column
df <- ddply(data, .(Reach), transform, MaxHQByReach=max(HQ))

# now select the rows where the HQ equals the Max HQ, dropping the above column
subset(df, df$HQ==df$MaxHQByReach)[,1:(ncol(df)-1)]
于 2012-07-27T01:34:46.430 に答える
2

こんにちはあなたはまたこのようにmaxとlapplyを使うことができます:

Reach <- unique(my_df$Reach)
        HQ <- unlist(lapply(1:length(unique(my_df$Reach)),function(x) max(my_df$HQ[which(my_df$Reach == unique(my_df$Reach)[x])])))

        Chem <- my_df$Chem[match(lapply(1:length(unique(my_df$Reach)),function(x) max(my_df$HQ[which(my_df$Reach == unique(my_df$Reach)[x])])),my_df$HQ)]

            new.df <- data.frame(Reach,Chem,HQ)
        new.df

          Reach    Chem   HQ
        1     a  Nickel 1.65
        2     b Cadmium 3.12
        3     c  Nickel 2.34
于 2012-07-27T05:22:38.943 に答える