2012-06-15 12 views
7

Dados dos tramas de datos:columnas Eliminación basados ​​en el valor de una fila

C1<-c(3,4,4,4,5) 
C2<-c(3,7,3,4,5) 
C3<-c(5,6,3,7,4) 
DF<-data.frame(C1=C1,C2=C2,C3=C3) 
DF 
    C1 C2 C3 
1 3 3 5 
2 4 7 6 
3 4 3 3 
4 4 4 7 
5 5 5 4 

y

V1<-c(3,2,2,4,5) 
V2<-c(3,7,3,5,2) 
V3<-c(5,2,5,7,5) 
V4<-c(1,1,2,3,4) 
V5<-c(1,2,6,7,5) 
DF2<-data.frame(V1=V1,V2=V2,V3=V3,V4=V4,V5=V5) 
DF2 
    V1 V2 V3 V4 V5 
1 3 3 5 1 1 
2 2 7 2 1 2 
3 2 3 5 2 6 
4 4 5 7 3 7 
5 5 2 5 4 5 

Mirando en cada fila equivalente en ambas tramas de datos, existe una relación entre el valor de C3 y el número de columnas que quiero colocar en esa misma fila en DF2.

La relación entre el valor de C3 y el # de columnas en DF2 a caer tiene este aspecto

If C3≥7 drop V5 
If C3=6.0:6.9 drop V4 and up (so basically V5,V4) 
If C3=5.0:5.9 drop V3 and up (so basically V5,V4,V3) 
If C3=4.0:4.9 drop V2 and up (so basically V5,V4,V3,V2) 
If C3≤3.9 drop entire row 

Para este ejemplo, sobre la base de los valores de C3, me gustaría DF2 a este aspecto

V1 V2 V3 V4 V5 
1 3 3 
2 2 7 2 

4 4 5 7 3 
5 5 

he intentado escribir un script sencillo para hacer esto (estoy bastante nuevo, así que me gusta mantener las cosas simples para que pueda ver lo que está pasando) pero yo estoy tirando errores a izquierda y derecha por lo que' Aprecio algunos consejos sobre cómo proceder

+0

no especificó qué fila (en la que tabla de datos, asumiendo su ' DF') para caer cuando 'C3 <= 3.9' – Subs

Respuesta

4

me gusta la respuesta de Koshke, pero si sus reglas de fijación de NA no tienen una buena propiedad matemática para ellos o necesita definir sus reglas arbitrariamente, este enfoque debería darle esa flexibilidad. En primer lugar, definir una función que devuelve las columnas a caer sobre la base de sus reglas:

f <- function(x) { 
    if(x >= 7){ 
    out <- 5 
    }else if(x >= 6.0){ 
      out <- 4:5 
    } else if(x >= 5.0){ 
    out <- 3:5 
    } else if (x >= 4.0){ 
    out <- 2:5 
    } else { 
    out <- 1:5 
    } 
    return(out) 
} 

A continuación, cree una lista de los índices de columna a los golpes:

z <- lapply(DF$C3, f) 

Por último, recorrer cada fila ajuste de la columnas correspondientes a NA:

for(j in seq(length(z))){ 
    DF2[j, z[[j]]] <- NA 
} 

#----- 
    V1 V2 V3 V4 V5 
1 3 3 NA NA NA 
2 2 7 2 NA NA 
3 NA NA NA NA NA 
4 4 5 7 3 NA 
5 5 NA NA NA NA 
4

Tal vez la forma más fácil es como:

DF3 <- DF2 
for (i in seq_len(nrow(DF3))) { 
    DF3[i, seq_len(ncol(DF3)) >= DF[i, ]$C3 - 2] <- NA 
} 
DF3 

entonces,

> DF3 
    V1 V2 V3 V4 V5 
1 3 3 NA NA NA 
2 2 7 2 NA NA 
3 NA NA NA NA NA 
4 4 5 7 3 NA 
5 5 NA NA NA NA 
2

Una ligera variación en la respuesta de kohske usando puntos de corte definidos:

breaksx <- cut(DF$C3,c(0,3,4,5,6,7,Inf),labels=FALSE) 
for (i in seq(nrow(DF2))) { 
     DF2[i,breaksx[i]:ncol(DF2)] <- NA 
} 

Resultado:

> DF2 
    V1 V2 V3 V4 V5 
1 3 3 NA NA NA 
2 2 7 2 NA NA 
3 NA NA NA NA NA 
4 4 5 7 3 NA 
5 5 NA NA NA NA 

Para eliminar las filas que son todos AN

DF2[apply(DF2,1,function(x) !all(is.na(x))),] 

Resultado:

V1 V2 V3 V4 V5 
1 3 3 NA NA NA 
2 2 7 2 NA NA 
4 4 5 7 3 NA 
5 5 NA NA NA NA 
Cuestiones relacionadas