R 根据多列之间的连接删除数据帧的行
考虑到以下数据框架:R 根据多列之间的连接删除数据帧的行,r,R,考虑到以下数据框架: # 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) ) #输入 a如果速度不是你主要关心的问题,我
# 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)
)
#输入
a如果速度不是你主要关心的问题,我认为这是很容易理解的:
library(plyr)
ddply(a, "X1", function(x) {
n <- seq_len(nrow(x))
m <- outer(n, n, Vectorize(function(i,j) all(x[i, 2:3] < x[j, 2:3])))
i <- rowSums(m) > 0L
return(x[!i, ])
})
库(plyr)
ddply(a,“X1”,函数(x){
n函数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)
}
并保留您想要的行:
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
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