2013-09-16 9 views
7

Odczytuję dane z pliku csv. Jeśli widzę ten plik w R, mam:Używanie funkcji apply na macierzy z wpisami NA

V1 V2 V3 V4 V5 V6 V7 
1 14 25 83 64 987 45 78 
2 15 65 789 32 14 NA NA 
3 14 67 89 14 NA NA NA 

Jeśli chcę maksymalną wartość w każdej kolumnie, używam to:

apply(df,2,max) 

i jest to wynik:

V1 V2 V3 V4 V5 V6 V7 
15 67 789 64 NA NA NA 

ale działa na kolumnie, która nie ma NA. Jak mogę zmienić swój kod, aby porównać także kolumny z NA?

Odpowiedz

17

Wystarczy dodać na.rm=TRUE do swojego połączenia zatwierdzającego.

apply(df,2,max,na.rm=TRUE) 

Uwaga: Zakłada się, że każda kolumna ma co najmniej jeden punkt danych. Jeśli jeden nie będzie sum zwróci 0.

EDIT oparte na komentarz

fft nie ma na.rm argument. Dlatego będziesz musiał napisać własną funkcję.

apply(df,2,function(x){fft(x[!is.na(x)])}) 

Na przykład

df <- data.frame(matrix(5,5,5)) 
df[,3] <- NA 

> df 
    X1 X2 X3 X4 X5 
1 5 5 NA 5 5 
2 5 5 NA 5 5 
3 5 5 NA 5 5 
4 5 5 NA 5 5 
5 5 5 NA 5 5 

> apply(df,2,function(x){fft(x[!is.na(x)])}) 
$X1 
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i 
[5] 1.776357e-15+0i 

$X2 
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i 
[5] 1.776357e-15+0i 

$X3 
complex(0) 

$X4 
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i 
[5] 1.776357e-15+0i 

$X5 
[1] 2.500000e+01+0i 1.776357e-15+0i 1.776357e-15+0i 1.776357e-15+0i 
[5] 1.776357e-15+0i 
+0

Dziękuję za odpowiedź, ale jeśli mogę użyć 'zastosowanie (df, 2, FFT, na.rm = TRUE)' Pojawia się błąd: 'Błąd w FUN (newX [, i], ...): nieużywany argument (s) (na.rm = TRUE)' Wydaje się, że nie działa z FFT (z innymi takimi jak max, ...) działa dobrze – TangoStar

+1

Spójrz na '? apply': argumenty po FUN (np.' max' lub 'fft') są przekazywane do FUN. A 'fft' nie ma parametru' na.rm', dlatego pojawia się błąd. Możesz użyć 'na.omit()' na pierwszej kolumnie, a następnie 'fft'. – ROLO

+0

dziękuję Dayana :) jak mogę zaimplementować go z for()? – TangoStar

5

Inną opcją:

sapply(apply(df,2,na.exclude), fft) 

Edycja: kod powyżej może nie udać, jeśli apply() powraca do matrycy, a nie na liście. A stanie się tak, jeśli na przykład nie ma żadnych NA. pod oznaczeniem ustala, że:

sapply(tapply(m, col(m), na.exclude), max) 

ciekawe, nie ma potrzeby ustalania simplify=FALSE, w wyniku tapply() będzie tylko wtedy uproszczone na.exclude() zwraca pojedynczy skalara na kolumnę; iw tym przypadku sapply działa w ten sam sposób.

1

Inna opcja, to powróci -Inf czy wszystkie elementy są col NA

df<-structure(list(x = c(10, 12, 13), y = c(12, 13, NA), z = c(NA_real_, 
NA_real_, NA_real_)), .Names = c("x", "y", "z"), row.names = c(NA, 
-3L), class = "data.frame") 

kk<-Map(function(x) max(na.omit(df[,x])),as.list(names(df))) 
ll<-do.call(rbind,kk) 
rownames(ll)<-names(df) 

> ll 

[,1] 
x 13 
y 13 
z -Inf 
Powiązane problemy