我有一个大型的data.frame,例如:
> m <- matrix(c(3,6,2,5,3,3,2,5,4,3,5,3,6,3,6,7,5,8,2,5,5,4,9,2,2), nrow=5, ncol=5)
> colnames(m) <- c("A", "B", "C", "D", "E")
> rownames(m) <- c("a", "b", "c", "d", "e")
> m
A B C D E
a 3 3 5 7 5
b 6 2 3 5 4
c 2 5 6 8 9
d 5 4 3 2 2
e 3 3 6 5 2
我想删除所有行,其中A和/或B列的值大于C D和E列。 所以在这种情况下,行b,d,e应该被删除,我应该得到这个:
A B C D E
a 3 3 5 7 5
c 2 5 6 8 9
无法逐个删除它们,因为data.frame有超过一百万行。 感谢
答案 0 :(得分:2)
使用子集以及pmin()
和pmax()
来保留所需的值。我不确定我是否完全理解你的标准(你说&#34; CD和E&#34;但是既然你想丢掉行e
,我认为你的意思是C,D 或 E),但以下似乎可以做你想要的:
> m[pmax(m[,"A"],m[,"B"])<=pmin(m[,"C"],m[,"D"],m[,"E"]),]
A B C D E
a 3 3 5 7 5
c 2 5 6 8 9
答案 1 :(得分:0)
# creating the df
m <- matrix(c(3,6,2,5,3,3,2,5,4,3,5,3,6,3,6,7,5,8,2,5,5,4,9,2,2), nrow=5, ncol=5)
colnames(m) <- c("A", "B", "C", "D", "E")
rownames(m) <- c("a", "b", "c", "d", "e")
# initialize as data frame.
m <- as.data.frame(m)
df_n <- m
for(i in 1:nrow(m)){
#print(i)
#print(paste(max(m[,1:2][i,]), max(m[,3:5][i,])))
if(max(m[,1:2][i,]) > (max(m[,3:4][i,])) || max(m[,1:2][i,]) > ((m[,5])[i])){
#df_n <- m[-i,]
df_n[i,] <- NA
}
}
#df_n
df_n <- df_n[complete.cases(df_n), ]
print(df_n)
Results
> print(df_n)
A B C D E
a 3 3 5 7 5
c 2 5 6 8 9
答案 2 :(得分:0)
以下是apply
的另一种解决方案:
m[apply(m, 1, function(x) max(x[1], x[2]) < min(x[3], x[4], x[5])),]
<强>结果:强>
A B C D E
a 3 3 5 7 5
c 2 5 6 8 9
我认为你的意思是删除 max(A,B)&gt;的行。 min(C,D,E),转换为保留A和B的所有值小于C,D和所有值的行即