2012-06-15 18 views
7

otrzymuje dwie ramki danych:Usuwanie kolumn w oparciu o wartości rzędu

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 

i

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 

patrząc na siebie równoważnego wiersza w obu ramkach danych, istnieje związek pomiędzy wartością w C3 i liczba kolumn, które chcę upuścić w tym samym wierszu w DF2.

Zależność pomiędzy wartością w C3 i # kolumn w df2 do spadku wygląda następująco

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 

W tym przykładzie, opartej na wartościach C3, chciałbym DF2 wyglądać tak

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

4 4 5 7 3 
5 5 

Próbowałem napisać prosty skrypt, aby to zrobić (jestem całkiem nowy, więc lubię utrzymywać rzeczy proste, więc mogę zobaczyć, co się dzieje), ale rzucam błędy w lewo i prawo, więc " doceń porady dotyczące postępowania:

+0

nie określono, który wiersz (w którym DataTable, wypełniania jej ' DF') spadnie, gdy "C3 <= 3,9" – Subs

Odpowiedz

4

Lubię odpowiedź Koshke, ale jeśli zasady ustalania do NA nie mają ładny obiekt matematyczny do nich ani ciebie trzeba dowolnie definiować swoje zasady, takie podejście powinno zapewnić taką elastyczność. Po pierwsze, należy zdefiniować funkcję, która zwraca kolumny do spadku na podstawie reguł:

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

Następnie należy utworzyć listę dla indeksów kolumn spadać:

z <- lapply(DF$C3, f) 

Wreszcie pętli każdego wiersza ustawienie odpowiadającej kolumny do 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

Być może najprostszym sposobem jest jak:

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

wtedy,

> 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

niewielkie zmiany na odpowiedź kohske za pomocą określonych punktów cięte:

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 
} 

Wynik:

> 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 

Aby usunąć wiersze, które są wszystkim agencjom krajowym

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

Wynik:

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 
Powiązane problemy