2012-06-15 17 views
7

Dati due frame di dati:Eliminazione colonne in base al valore di 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 

e

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 

Esaminando ogni fila equivalente in entrambe le trame di dati, v'è una relazione tra il valore C3 e il numero di colonne che voglio rilasciare nella stessa riga in DF2.

Il rapporto tra il valore di C3 e il # di colonne in DF2 a cadere aspetto come questo

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 

Per questo esempio, sulla base dei valori di C3, vorrei DF2 a guardare come questo

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

4 4 5 7 3 
5 5 

ho provato scrivere un semplice script per fare questo (sto abbastanza nuovo quindi mi piace mantenere le cose semplici in modo da poter vedere cosa sta succedendo), ma sto buttando errori a sinistra ea destra in modo sono d apprezzo alcuni consigli su come procedere

+0

non è stato specificato quale riga (in cui DataTable, assumendone il ' DF') da rilasciare quando 'C3 <= 3.9' – Subs

risposta

4

mi piace la risposta di Koshke, ma se le regole per l'impostazione di NA non hanno una bella proprietà matematica a loro o voi è necessario definire le regole arbitrariamente, questo approccio dovrebbe darti quella flessibilità. In primo luogo, definire una funzione che restituisce le colonne di goccia basato su regole:

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) 
} 

successivo, creare un elenco per gli indici di colonna a goccia:

z <- lapply(DF$C3, f) 

Infine, ciclo attraverso ogni riga impostando la colonne corrispondenti 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

Forse il modo più semplice è come:

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

poi,

> 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 leggera variazione sulla risposta kohske utilizzando punti di taglio definiti:

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 
} 

Risultato:

> 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 

Per rimuovere le righe che sono tutti AN

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

Risultato:

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 
Problemi correlati