2016-09-15 57 views
1

我一直忙于看起来像下面如何删除行的时候,他们不符合标准

df<- structure(list(V1 = structure(1:6, .Label = c("A", "B", "C", 
"D", "E", "F"), class = "factor"), V2 = structure(1:6, .Label = c("AA", 
"BB", "CC", "DD", "EE", "FF"), class = "factor"), V3 = structure(c(6L, 
5L, 4L, 1L, 3L, 2L), .Label = c("hddu", "jfhu", "jshsg", "kduf", 
"Tlsu", "Trsm"), class = "factor"), V4 = c(1L, 2L, 0L, 0L, 5L, 
6L), V5 = c(0L, 2L, 0L, 4L, 0L, 5L), V6 = c(0L, 0L, 4L, 6L, 0L, 
7L), V7 = c(0L, 0L, 5L, 0L, 0L, 8L), V8 = c(0L, 0L, 0L, 0L, 6L, 
0L), V9 = c(0L, 0L, 0L, 7L, 0L, 0L)), .Names = c("V1", "V2", 
"V3", "V4", "V5", "V6", "V7", "V8", "V9"), class = "data.frame", row.names = c(NA, 
-6L)) 

看起来像这样

V1 V2 V3 V4 V5 V6 V7 V8 V9 
1 A AA Trsm 1 0 0 0 0 0 
2 B BB Tlsu 2 2 0 0 0 0 
3 C CC kduf 0 0 4 5 0 0 
4 D DD hddu 0 4 6 0 0 7 
5 E EE jshsg 5 0 0 0 6 0 
6 F FF jfhu 6 5 7 8 0 0 

我想是删除数据对于至少2列连续没有值的行。例如,他们应该有前2列,或者后2列或第3列,如果他们有更多的话,那就可以了。 我想检测到它们,以及在这种情况下作出的输出没有它们

行号1,4和5,所以我需要两个输出

1-索引1,4和5(该节目哪些行被删除) 2-预期的输出是这样的

B BB Tlsu 2 2 0 0 0 0 
C CC kduf 0 0 4 5 0 0 
F FF jfhu 6 5 7 8 0 0 
+3

对于您的输入,所有行都具有所有列的值。解释你真正需要的。 “对某些专栏没有价值”是什么意思? – user31264

+1

@ user31264我的意思是没有零 – nik

+0

如果你的意思不是零,那么第四排呢? – akrun

回答

1

可以手动拾取具有索引,其由一个水平移位和使用矢量&找出两个数据帧,如果有任何连续TRUE和收集行明智的条件与rowSums滤波指数:

df[rowSums(df[4:8] & df[5:9]) != 0, ] 

# V1 V2 V3 V4 V5 V6 V7 V8 V9 
# 2 B BB Tlsu 2 2 0 0 0 0 
# 3 C CC kduf 0 0 4 5 0 0 
# 4 D DD hddu 0 4 6 0 0 7 
# 6 F FF jfhu 6 5 7 8 0 0 

如果列具有待配对每隔一列,seq可以用来生成所需的索引:

df[rowSums(df[seq(4, 9, 2)] & df[seq(5, 9, 2)]) != 0, ] 

# V1 V2 V3 V4 V5 V6 V7 V8 V9 
#2 B BB Tlsu 2 2 0 0 0 0 
#3 C CC kduf 0 0 4 5 0 0 
#6 F FF jfhu 6 5 7 8 0 0 
+0

这是非常好的解决方案,但不完全正确。你有第4行不应该在输出。它们必须至少在列V4和V5,或V6和V7或V8和V9中具有值(不为零)。 – nik

+0

检查更新的答案。有关每隔一列进行配对的更新。 – Psidom

1

的逻辑并不清楚。但是,这似乎工作

df[Reduce(`|`, Map(`&`, df[-(1:3)][c(TRUE, FALSE)], df[-(1:3)][c(FALSE, TRUE)])),] 
# V1 V2 V3 V4 V5 V6 V7 V8 V9 
#2 B BB Tlsu 2 2 0 0 0 0 
#3 C CC kduf 0 0 4 5 0 0 
#6 F FF jfhu 6 5 7 8 0 0 
相关问题