2015-05-16 20 views
7

Tôi cần phải thay thế các giá trị còn thiếu trong "bước" bằng trung bình "bước" được tính toán trong ngày cụ thể đó (nhóm theo "ngày"). Tôi đã giới thiệu số này thread nhưng giá trị NA của tôi không được thay thế. Ai đó có thể giúp tôi tìm ra nơi tôi đang đi sai? Tôi muốn sử dụng gói cơ sở dữ liệu/bảng/plyr. Tập dữ liệu trông xấp xỉ. như thế này: -xử lý dữ liệu với trung vị theo ngày trong R

 steps  date interval 
    1: NA 2012-10-01  0 
    2: NA 2012-10-01  5 
    3: NA 2012-10-01  10 
    4: NA 2012-10-01  15 
    5: NA 2012-10-01  20 
    ---       
17564: NA 2012-11-30  2335 
17565: NA 2012-11-30  2340 
17566: NA 2012-11-30  2345 
17567: NA 2012-11-30  2350 
17568: NA 2012-11-30  2355 

Cấu trúc và tóm tắt các bộ dữ liệu (hoạt động) như hình dưới đây

#str(activity) 
Classes ‘data.table’ and 'data.frame': 17568 obs. of 3 variables: 
    $ steps : int NA NA NA NA NA NA NA NA NA NA ... 
    $ date : Date, format: "2012-10-01" "2012-10-01" "2012-10-01" ... 
    $ interval: int 0 5 10 15 20 25 30 35 40 45 ... 

#summary(activity) 
     steps    date    interval  
    Min. : 0.00 Min. :2012-10-01 Min. : 0.0 
    1st Qu.: 0.00 1st Qu.:2012-10-16 1st Qu.: 588.8 
    Median : 0.00 Median :2012-10-31 Median :1177.5 
    Mean : 37.38 Mean :2012-10-31 Mean :1177.5 
    3rd Qu.: 12.00 3rd Qu.:2012-11-15 3rd Qu.:1766.2 
    Max. :806.00 Max. :2012-11-30 Max. :2355.0 
    NA's :2304  

Những điều tôi đã cố gắng:

phương pháp DataTable:

activityrepNA<-activity[,steps := ifelse(is.na(steps), median(steps, na.rm=TRUE), steps), by=date] 
summary(activityrepNA) 
    steps    date    interval  
Min. : 0.00 Min. :2012-10-01 Min. : 0.0 
1st Qu.: 0.00 1st Qu.:2012-10-16 1st Qu.: 588.8 
Median : 0.00 Median :2012-10-31 Median :1177.5 
Mean : 37.38 Mean :2012-10-31 Mean :1177.5 
3rd Qu.: 12.00 3rd Qu.:2012-11-15 3rd Qu.:1766.2 
Max. :806.00 Max. :2012-11-30 Max. :2355.0 
NA's :2304 

Sử dụng ave

activity$steps[is.na(activity$steps)] <- with(activity, ave(steps,date, FUN = function(x) median(x, na.rm = TRUE)))[is.na(activity$steps)] 
> summary(activity) 
    steps    date    interval  
Min. : 0.00 Min. :2012-10-01 Min. : 0.0 
1st Qu.: 0.00 1st Qu.:2012-10-16 1st Qu.: 588.8 
Median : 0.00 Median :2012-10-31 Median :1177.5 
Mean : 37.38 Mean :2012-10-31 Mean :1177.5 
3rd Qu.: 12.00 3rd Qu.:2012-11-15 3rd Qu.:1766.2 
Max. :806.00 Max. :2012-11-30 Max. :2355.0 
NA's :2304 

Nỗ lực tại ddply

cleandatapls<-ddply(activity, 
+  .(as.character(date)), 
+  transform, 
+  steps=ifelse(is.na(steps), median(steps, na.rm=TRUE), steps)) 
> summary(cleandatapls) 
as.character(date)  steps    date    interval  
Length:17568  Min. : 0.00 Min. :2012-10-01 Min. : 0.0 
Class :character 1st Qu.: 0.00 1st Qu.:2012-10-16 1st Qu.: 588.8 
Mode :character Median : 0.00 Median :2012-10-31 Median :1177.5 
        Mean : 37.38 Mean :2012-10-31 Mean :1177.5 
        3rd Qu.: 12.00 3rd Qu.:2012-11-15 3rd Qu.:1766.2 
        Max. :806.00 Max. :2012-11-30 Max. :2355.0 
        NA's :2304 

tổng hợp để tính ra

whynoclean<-aggregate(activity,by=list(activity$date),FUN=median,na.rm=TRUE) 
> summary(whynoclean) 
    Group.1    steps  date    interval 
Min. :2012-10-01 Min. :0 Min. :2012-10-01 Min. :1178 
1st Qu.:2012-10-16 1st Qu.:0 1st Qu.:2012-10-16 1st Qu.:1178 
Median :2012-10-31 Median :0 Median :2012-10-31 Median :1178 
Mean :2012-10-31 Mean :0 Mean :2012-10-31 Mean :1178 
3rd Qu.:2012-11-15 3rd Qu.:0 3rd Qu.:2012-11-15 3rd Qu.:1178 
Max. :2012-11-30 Max. :0 Max. :2012-11-30 Max. :1178 
         NA's :8      

EDIT trung bình cho các mã sử dụng đột biến

activity %>% group_by(date) %>% mutate(steps = replace(steps, is.na(steps), median(steps, na.rm = T))) 
Source: local data table [17,568 x 3] 

    steps  date interval 
1  NA 2012-10-01  0 
2  NA 2012-10-01  5 
3  NA 2012-10-01  10 
4  NA 2012-10-01  15 
5  NA 2012-10-01  20 
6  NA 2012-10-01  25 
7  NA 2012-10-01  30 
8  NA 2012-10-01  35 
9  NA 2012-10-01  40 
10 NA 2012-10-01  45 
.. ...  ...  ... 

UPDATE:

Steven Beaupre giúp tôi nhận ra rằng cách tiếp cận của tôi đối với việc imputing là thiếu sót vì có những ngày cụ thể chỉ có các giá trị NA đã gây ra vấn đề như trung bình của NA là NA. Đã sử dụng một cách tiếp cận được đề xuất khác.

Trả lời

4

Hãy thử:

library(dplyr) 
df %>% 
    group_by(date) %>% 
    mutate(steps = ifelse(is.na(steps), median(steps, na.rm = T), steps)) 

Nếu vì một ngày nào đó, tất cả các bước NA s, bạn có thể thay thế chúng bằng 0:

df %>% 
    group_by(date) %>% 
    mutate(steps = ifelse(all(is.na(steps)), 0, 
         ifelse(is.na(steps), median(steps, na.rm = T), steps))) 
+0

Cảm ơn! Tôi có cần tải thư viện không? Nó đang nói không thể tìm thấy hàm%>% – Meeshu

+0

Hãy thử 'install.packages (" dplyr "); thư viện (dplyr) ' –

+0

Xin chào, cảm ơn một lần nữa nhưng tôi cần phải thay thế nó bằng trung bình các bước (được tính sau khi loại bỏ các giá trị NA) và không phải là trung bình của khoảng thời gian. Tôi đã thử mã bằng cách thay thế khoảng thời gian bằng các bước và NA vẫn còn. Chỉnh sửa câu hỏi để chỉ định nó – Meeshu

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