2013-03-11 25 views
9

Tôi có tập dữ liệu trong R trông giống như đã được định dạng lại theo cách tương tự như ví dụ sau. Mục đích là để biến giá trị QH thông qua tháng tới cái gì khác (ví dụ: "FALSE" hoặc "0") mà sau đó có thể được sử dụng để tạo một cột mớiThay thế NA trong R - hoạt động trong tập dữ liệu thực hành nhưng thông báo cảnh báo khi được áp dụng cho dữ liệu thực tế

ortho.test<-data.frame(rep("a",10));colnames(ortho.test)=("ODB6") 
ortho.test$FBGN=c("FBgn0132258","FBgn0131535","FBgn0138769","FBgn01561235","FBgn0316645","FBgn874916","FBgn5758641","FBgn5279946","FBgn67543154","FBgn2451645") 
ortho.test$Species=c("DROME","DROSI","DROSE","DROAN","DROYA","DROPS","DROPE","DROVI","DROGR","DROWI") 

ortho<-reshape(ortho.test,direction="wide",idvar="ODB6",timevar="Species") 
ortho$FBGN.DROME<-NA 
is.na(ortho) 

nào trả về một vector nói với tôi tất cả nhưng FBGN.DROME là FALSE với str sau() đầu ra:

> str(ortho) 
'data.frame': 1 obs. of 11 variables: 
$ ODB6  : Factor w/ 1 level "a": 1 
$ FBGN.DROME: logi NA 
$ FBGN.DROSI: chr "FBgn0131535" 
$ FBGN.DROSE: chr "FBgn0138769" 
$ FBGN.DROAN: chr "FBgn01561235" 
$ FBGN.DROYA: chr "FBgn0316645" 
$ FBGN.DROPS: chr "FBgn874916" 
$ FBGN.DROPE: chr "FBgn5758641" 
$ FBGN.DROVI: chr "FBgn5279946" 
$ FBGN.DROGR: chr "FBgn67543154" 
$ FBGN.DROWI: chr "FBgn2451645" 
- attr(*, "reshapeWide")=List of 5 
    ..$ v.names: NULL 
    ..$ timevar: chr "Species" 
    ..$ idvar : chr "ODB6" 
    ..$ times : chr "DROME" "DROSI" "DROSE" "DROAN" ... 
    ..$ varying: chr [1, 1:10] "FBGN.DROME" "FBGN.DROSI" "FBGN.DROSE" "FBGN.DROAN" ... 

tôi thay đổi NA tôi để 0

ortho[is.na(ortho)]<-0 
is.na(ortho) 

nào trả về một vector nói với tôi tất cả bây giờ là FALSE - một thành công bởi vì bây giờ tôi có thể tạo ac olumn sử dụng ifelse() để hiển thị các hàng nào không có 0 hoặc FALSE (hoặc bất kỳ nhãn văn bản nào tôi sử dụng để thay thế NA) trong bất kỳ cột nào ...

Tuy nhiên, khi tôi áp dụng điều này cho toàn bộ khung dữ liệu của NA không chuyển đổi và tôi nhận được những lời cảnh báo sau

> ortho[is.na(ortho)]<-0 
There were 12 warnings (use warnings() to see them) 
> warnings() 
Warning messages: 
1: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(62938L, ... : 
    invalid factor level, NAs generated 
2: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(67667L, ... : 
    invalid factor level, NAs generated 
3: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(122384L, ... : 
    invalid factor level, NAs generated 
4: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(136498L, ... : 
    invalid factor level, NAs generated 
5: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(84764L, ... : 
    invalid factor level, NAs generated 
6: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(162734L, ... : 
    invalid factor level, NAs generated 
7: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(33586L, ... : 
    invalid factor level, NAs generated 
8: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(38959L, ... : 
    invalid factor level, NAs generated 
9: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(149363L, ... : 
    invalid factor level, NAs generated 
10: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(846L, ... : 
    invalid factor level, NAs generated 
11: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(98228L, ... : 
    invalid factor level, NAs generated 
12: In `[<-.factor`(`*tmp*`, thisvar, value = structure(c(110267L, ... : 
    invalid factor level, NAs generated 

và đây là str() đầu ra

> str(ortho) 
    'data.frame': 17217 obs. of 13 variables: 
    $ ODB6  : Factor w/ 17217 levels "EOG60023J","EOG60023K",..: 1 2 3 4 5 6 7 8 9 10 ... 
    $ FBGN.DROGR: Factor w/ 164289 levels "FBgn0000008",..: 62938 54687 54705 56261 52591 58895 52161 52477 59180 53404 ... 
    $ FBGN.DROMO: Factor w/ 164289 levels "FBgn0000008",..: 67667 65117 65951 66506 68291 71722 73134 68667 72523 76080 ... 
    $ FBGN.DROVI: Factor w/ 164289 levels "FBgn0000008",..: 122384 121133 120018 121674 NA 125620 123754 123969 127130 130755 ... 
    $ FBGN.DROWI: Factor w/ 164289 levels "FBgn0000008",..: 136498 136809 139642 137108 NA 141689 136363 137237 135869 132801 ... 
    $ FBGN.DROPE: Factor w/ 164289 levels "FBgn0000008",..: 84764 78121 81229 80829 85509 82276 79001 80267 77133 87679 ... 
    $ FBGN.DROPS: Factor w/ 164289 levels "FBgn0000008",..: 162734 158625 162203 158653 158028 22427 158179 13830 19898 160874 ... 
    $ FBGN.DROAN: Factor w/ 164289 levels "FBgn0000008",..: 33586 35261 35694 23649 33601 25796 33808 33861 25917 29992 ... 
    $ FBGN.DROER: Factor w/ 164289 levels "FBgn0000008",..: 38959 41203 40738 39865 38807 46087 38821 44982 47952 38091 ... 
    $ FBGN.DROYA: Factor w/ 164289 levels "FBgn0000008",..: 149363 153417 153106 152243 149654 147146 149664 149482 147635 144838 ... 
    $ FBGN.DROME: Factor w/ 164289 levels "FBgn0000008",..: 846 7219 6958 162946 525 1892 125 3510 163839 10111 ... 
    $ FBGN.DROSE: Factor w/ 164289 levels "FBgn0000008",..: 98228 94438 94153 102953 98068 95380 98082 92553 93497 95950 ... 
    $ FBGN.DROSI: Factor w/ 164289 levels "FBgn0000008",..: 110267 108223 107983 107246 110164 117494 116973 110504 106459 NA ... 
    - attr(*, "reshapeWide")=List of 5 
     ..$ v.names: NULL 
     ..$ timevar: chr "Species" 
     ..$ idvar : chr "ODB6" 
     ..$ times : Factor w/ 12 levels "DROAN","DROER",..: 3 5 10 11 6 7 1 2 12 4 ... 
     ..$ varying: chr [1, 1:12] "FBGN.DROGR" "FBGN.DROMO" "FBGN.DROVI" "FBGN.DROWI" ... 
    > 

Ông có thể giúp tôi có được dataframe chính để chơi cùng như thử nghiệm một đã làm ? (PS - Tôi biết tôi sẽ nhận được "đây là một bản sao, đọc các trang trợ giúp và tìm kiếm đúng" phản hồi - nhưng tôi đã tìm kiếm, đó là cách tôi tìm ra cách thay thế NA, và tôi đã không tìm thấy bất kỳ với cùng một vấn đề này.)

+1

Bạn không nhận thấy sự khác biệt giữa các đầu ra của 'str' trong hai ví dụ của bạn? – joran

+0

@joran Cảm ơn, tôi có thể thấy rằng bây giờ - vì vậy có lẽ là yếu tố là nguyên nhân của vấn đề, nhưng điều này đặt ra hai câu hỏi: 1. Tại sao dữ liệu thử nghiệm lại là ký tự nhưng dữ liệu thực tế có vẻ là yếu tố? và (quan trọng hơn) 2. làm thế nào @ & ?! được sửa chữa này? – Ell

+1

Xem các đối số 'as.is',' colClasses' và 'stringsAsFactors' trong tài liệu cho' read.table'. – joran

Trả lời

23

Bạn có vấn đề về yếu tố. Nếu bạn nhìn vào bộ dữ liệu thực sự của bạn, bạn sẽ nhận thấy sự

Factor w/ 164289 levels ..... 

Ví dụ,

R> x = factor(c("A", "B")) 
R> x[x=="A"] = 0 
Warning message: 
In `[<-.factor`(`*tmp*`, x == "A", value = 0) : 
    invalid factor level, NAs generated 

Bạn cần phải thêm 0 như một cấp độ. Vì vậy, một cái gì đó như:

x = factor(x, levels=c(levels(x), 0)) 
x[is.na(x)] = 0 

nên thực hiện thủ thuật. Tuy nhiên, một chiến thuật tốt hơn sẽ là thay đổi cách bạn đọc dữ liệu. Ví dụ:

read.table(filename, stringsAsFactors=FALSE) 
3

Đối với những người có dữ liệu không đến từ việc đọc tệp. Chuyển đổi mỗi cột của data.frame có thể được thực hiện với vòng lặp này (áp dụng sẽ không hoạt động vì nó chuyển đổi một data.frame thành một ma trận):

for (k in 1:ncol(data)){ 
    data[[k]] <- as.character(data[[k]]) 
} 

Và sau đó áp dụng các giải pháp của question này nếu các giải pháp cấp độ doesn 't làm việc.

+0

Bạn đã xem 'lapply' thay vì 'apply' chưa? – Uwe

Các vấn đề liên quan