次のデータフレームを検討します。
# input
a <- data.frame(
X1=c("a","a","a","a","a","a","a","a","a","a","a","b","b","b","b","b","b","b","b","b"),
X2=c(2,4,6,2,4,7,9,5,4,7,3,5,8,4,3,5,7,6,3,5),
X3=c(5,6,1,4,7,5,5,4,4,2,5,4,5,2,4,7,3,5,3,7)
)
変数2と変数3の両方の点で、2つの行が同じ因子レベル(変数1)である別の行よりも小さい行を削除するにはどうすればよいですか?
例えば
a[1,1]==a[2,1] and
a[1,2]<a[2,2] and
a[1,3]<a[2,3] then a[1,] should be removed.
# output
a <- data.frame( X1=c("a","a","a","a","b","b","b","b"),
X2=c(4,4,7,9,8,5,6,5),
X3=c(6,7,5,5,5,7,5,7) )
関数isRemoved
は各行の条件を与えるTRUE
かFALSE
与えますi
:
isRemoved = function(i, a) {
out = logical(nrow(a))
for(j in 1:nrow(a)) {
out[j] = a[i,1]==a[j,1] & a[i,2]<a[j,2] & a[i,3]<a[j,3]
}
out = any(out)
return(out)
}
次に、それをすべての行に適用できます。
remove = sapply(1:nrow(a), isRemoved, a=a)
必要な行を保持します。
a.new = a[!remove, ]
a.new
X1 X2 X3
2 a 4 6
5 a 4 7
6 a 7 5
7 a 9 5
13 b 8 5
16 b 5 7
18 b 6 5
20 b 5 7
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加