2017-10-05 60 views
3

我有一個大的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柱比CD和更大的價值E列。 所以在這種情況下,行B,d,E應當去掉,我應該得到這樣的:

A B C D E 
a 3 3 5 7 5 
c 2 5 6 8 9 

因爲data.frame有超過一百萬行不能由一個刪除一個。 謝謝

+3

如果A,B的最小值大於C,D,E的最大值,你想刪除它們嗎? –

+0

我會建議使用'data.frame'而不是'matrix'對象和'subset'函數 –

回答

2

使用子集與pmin()pmax()一起保留所需的值。我不確定我是否完全理解你的標準(你說「CD和E」,但是因爲你想扔掉第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 
+0

準確地說,我想刪除A列和/或B列的最小值大於最大值的行C,D和E列。謝謝 – Ioannis

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 
+0

@loannis這玩過我,直到我意識到你想要或意味着C,D或E.請糾正你的問題。 – ngamita

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)>分鐘(C,d,E),轉化爲保持行,其中A和B的所有值較小比全部 C,D和E的值。