2014-10-13 59 views
6

Tôi đang học gói dplyr trong R và tôi thực sự thích nó. Nhưng bây giờ tôi đang xử lý các giá trị NA trong dữ liệu của tôi.R: Thay thế giá trị NA theo giá trị giờ bằng dplyr

Tôi muốn thay thế bất kỳ NA bằng mức trung bình của giờ tương ứng, ví dụ với ví dụ rất đơn giản này:

#create an example 
day = c(1, 1, 2, 2, 3, 3) 
hour = c(8, 16, 8, 16, 8, 16) 
profit = c(100, 200, 50, 60, NA, NA) 
shop.data = data.frame(day, hour, profit) 

#calculate the average for each hour 
library(dplyr) 
mean.profit <- shop.data %>% 
    group_by(hour) %>% 
    summarize(mean=mean(profit, na.rm=TRUE)) 

> mean.profit 
Source: local data frame [2 x 2] 

    hour mean 
1 8 75 
2 16 130 

Tôi có thể sử dụng dplyr lệnh transform để thay thế của Quốc hội trong ngày 3 trong lợi nhuận với 75 (cho 8:00) và 130 (cho 16:00)?

Trả lời

15

Hãy thử

shop.data %>% 
      group_by(hour) %>% 
      mutate(profit= ifelse(is.na(profit), mean(profit, na.rm=TRUE), profit)) 

    # day hour profit 
    #1 1 8 100 
    #2 1 16 200 
    #3 2 8  50 
    #4 2 16  60 
    #5 3 8  75 
    #6 3 16 130 

Hoặc bạn có thể sử dụng replace

shop.data %>% 
      group_by(hour) %>% 
      mutate(profit= replace(profit, is.na(profit), mean(profit, na.rm=TRUE))) 
+1

Tôi đến đây vì tôi không để ý tôi quên khóa: 'na.rm = TRUE' – jbkunst

3

Một cách tiếp cận (ít thanh lịch) với các chức năng cơ bản:

transform(shop.data, 
      profit = ifelse(is.na(profit), 
          ave(profit, hour, FUN = function(x) mean(x, na.rm = TRUE)), 
          profit)) 

# day hour profit 
# 1 1 8 100 
# 2 1 16 200 
# 3 2 8  50 
# 4 2 16  60 
# 5 3 8  75 
# 6 3 16 130 
Các vấn đề liên quan