1

したがって、列 2 に同じ名前の行を引き出したいデータフレームがあります。そのスコアは、他の複製よりも 2 大きいです。したがって、この例では、行 2 を保持しますが、行 5 は保持しません。

>df <- data.frame(score=c(1,5,1,3,3),name=c("A1","A1","A2","A3","A3"))
>df
score name
 1    A1
 5    A1
 1    A2
 3    A3
 3    A3

forループでやりたいことをほぼ実行し、「dup」と「keep」の小さなマトリックスを作成して、両方の条件を満たすデータフレームの行を引き出すことができます。

>test <- matrix(ncol=1,nrow=nrow(df))
>for(i in 1:nrow(df)){ifelse((df[i,"name"] == df[i-1,"name"]) && (df[i,"score"] >= (df[i-1,"score"] + 2)),test[i] <- "keep",test[i] <- "dup")}
> test
     [,1]  
[1,] NA    
[2,] "keep"
[3,] "dup" 
[4,] "dup" 
[5,] "dup"
>df[which(test[,1] == "keep"),]
    score name
2     5   A1

これは(最初のものを除いて)機能しますが、明らかに醜く、地獄のように遅いです。一部のバージョンの適用でこれを行う方法があるに違いないことはわかっていますが、関数で前の行を指定する方法がわかりませんでした。実際のデータフレームは巨大なので、よりきちんとした方法があれば素晴らしいでしょう。

最終的には名前が一意の行も保持する関数が欲しいので、これを同じ関数に組み込むことができれば非常に嬉しいです!

助けてくれてありがとう....

4

2 に答える 2

0

これを試して:

   
> 集計 (スコア ~ 名前、データ = df、最大)
   名前スコア
1 A1 5
2 A2 1
3 A3 3
于 2013-07-29T19:18:07.230 に答える