2014-08-29 98 views
0

我有以下DF:分組然後過濾數據

A B C D E F 
1 8 0 0 0 0 0 
2 2 1 5 7 1 2 
3 1 0 0 2 1 0 
4 6 0 0 0 0 2 

欲第一組數據分成2組,每組3次重複,例如A:C是一組,D:F是第二組。

然後,我希望在任何組中至少有2個複製/列中排除值爲0的任何行。所以我應該找回以下DF:

A B C D E F 
1 2 1 5 7 1 2 
2 1 0 0 2 1 0 

任何援助將不勝感激!

+0

你的結果DF沒有道理給我。它在第二行A列中有兩個零:C – 2014-08-29 06:15:32

+0

人們對「每個」,「或者」,「兩個」的使用常常與我對其邏輯含義的理解不同。 – 2014-08-29 06:19:24

回答

1

我的解釋是:

> dat[ rowSums(dat[1:3]==0)<2 | rowSums(dat[4:6]==0)<2 , ] 
    A B C D E F 
2 2 1 5 7 1 2 
3 1 0 0 2 1 0 

這是字面直譯(這應該是在邏輯上是相同的):

> dat[ !(rowSums(dat[1:3]==0)>=2 & rowSums(dat[4:6]==0)>=2) , ] 
    A B C D E F 
2 2 1 5 7 1 2 
3 1 0 0 2 1 0 
+0

是的,這可能是正確的。 – 2014-08-29 06:25:23

0

嘗試:

ddf = structure(list(A = c(8L, 2L, 1L, 6L), B = c(0L, 1L, 0L, 0L), 
    C = c(0L, 5L, 0L, 0L), D = c(0L, 7L, 2L, 0L), E = c(0L, 1L, 
    1L, 0L), F = c(0L, 2L, 0L, 2L)), .Names = c("A", "B", "C", 
"D", "E", "F"), class = "data.frame", row.names = c(NA, -4L)) 

df1 = ddf[,1:3] 
df2 = ddf[,4:6] 

ddf[which(rowSums(df2==0)<2 & rowSums(df1==0)<2),] 
    A B C D E F 
2 2 1 5 7 1 2 

你的標準是:「然後,我希望排除任何組中至少有2個複製/列中值爲0的行。「 因此只有一行滿足這個標準。您自己的答案(1 0 0 2 1 0) 中的第二行不符合此條件,因爲此處的第一組有2個零(1 0 0)。

0

如果你有2組以上,你可以這樣做:

N <- ncol(dat) 
indx <- Reduce(`|`, 
      lapply(seq(1,N, by=3), function(i) rowSums(!dat[i:(i+2)])<2)) 
dat[indx,] 
# A B C D E F 
#2 2 1 5 7 1 2 
#3 1 0 0 2 1 0 
相關問題