我有以下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
任何援助將不勝感激!
我有以下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
任何援助將不勝感激!
我的解釋是:
> 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
是的,這可能是正確的。 – 2014-08-29 06:25:23
嘗試:
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)。
如果你有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
你的結果DF沒有道理給我。它在第二行A列中有兩個零:C – 2014-08-29 06:15:32
人們對「每個」,「或者」,「兩個」的使用常常與我對其邏輯含義的理解不同。 – 2014-08-29 06:19:24