2013-09-16 20 views
7

Tôi đã đọc Dữ liệu từ tệp csv. Nếu tôi thấy tập tin này vào R, tôi có:Sử dụng hàm áp dụng trên ma trận với các mục nhập 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 

Nếu tôi muốn giá trị tối đa trong mỗi cột, tôi sử dụng này:

apply(df,2,max) 

và đây là kết quả:

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

nhưng nó hoạt động trên cột không có NA. Làm cách nào để thay đổi mã của tôi, cũng như so sánh các cột với NA?

Trả lời

17

Bạn chỉ cần thêm na.rm=TRUE vào cuộc gọi áp dụng của mình.

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

Lưu ý: Điều này cho rằng mỗi cột có ít nhất một điểm dữ liệu. Nếu một không sum sẽ trả lại 0.

EDIT DỰA VÀO COMMENT

fft không có một cuộc tranh cãi na.rm. Vì vậy, bạn sẽ cần phải viết chức năng của riêng bạn.

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

Ví dụ:

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

Cảm ơn bạn đã trả lời của bạn, nhưng Nếu tôi sử dụng 'áp dụng (df, 2, FFT, na.rm = TRUE)' Tôi nhận được một lỗi: 'Lỗi trong FUN (newX [, i], ...): đối số không sử dụng (s) (na.rm = TRUE)' Có vẻ như, rằng nó không làm việc với FFT (với những người khác như max, ...) nó hoạt động tốt – TangoStar

+1

Nhìn vào '? apply': các đối số sau FUN (ví dụ' max' hoặc 'fft') được chuyển đến FUN. Và 'fft' không có tham số' na.rm', do đó bạn gặp lỗi. Bạn có thể sử dụng 'na.omit()' trên cột đầu tiên, và sau đó là 'fft'. – ROLO

+0

thanks dayana :) làm thế nào tôi có thể thực hiện nó với for()? – TangoStar

5

Một tùy chọn khác:

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

EDIT: mã trên có thể thất bại nếu apply() trả về một ma trận thay vì một danh sách. Và điều này sẽ xảy ra nếu không có ví dụ NA. Đoạn code dưới đây sửa chữa rằng:

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

Thú vị, không có cần phải thiết lập simplify=FALSE, như là kết quả của tapply() sẽ chỉ được đơn giản hóa nếu na.exclude() trả về một đại lượng vô hướng duy nhất cho mỗi cột; và trong trường hợp này, sapply hoạt động theo cách tương tự.

1

Một lựa chọn khác, điều này sẽ trở -Inf nếu tất cả các yếu tố của col là 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