2016-02-12 42 views
4

我已根據三件事物索引價格數據:通過指數填寫R中的大量NA數據?

州,日期和UPC(即產品代碼)。

我有一堆價格是NA。

我試圖用以下方式填充新手:對於索引爲(S,D,UPC)的給定缺失價格,填寫所有具有相同S和UPC的數據點的平均價格。即,取日期的平均值。

必須有一個非常簡單的方法來做到這一點,因爲這非常簡單。我一直在使用for循環,但是現在我意識到這非常低效,我想使用一個函數,例如plyr或dplyr中的函數,它將盡可能少地執行所有操作。

upc=c(1153801013,1153801013,1153801013,1153801013,1153801013,1153801013,2105900750,2105900750,2105900750,2105900750,2105900750,2173300001,2173300001,2173300001,2173300001) 
date=c(200601,200602,200603,200604,200601,200602,200601,200602,200603,200601,200602,200603,200604,200605,200606) 
price=c(26,28,NA,NA,23,24,85,84,NA,81,78,24,19,98,NA) 
state=c(1,1,1,1,2,2,1,1,2,2,2,1,1,1,1) 

# This is what I have: 
data <- data.frame(upc,date,state,price) 

# This is what I want: 
price=c(26,28,27,27,23,24,85,84,79.5,81,78,24,19,98,47) 
data2 <- data.frame(upc,date,state,price) 

有什麼建議嗎?謝謝。

+0

對不起,我是新來這個...我想如果你只是告訴我,我做錯了什麼,而不是被動攻擊鏈接和大拇指朝下升值。 – ejn

+1

@ejn - 這不是被動的攻擊,這些問題簡要描述了你需要爲人們提供一個合理的答案。它們基本上是Stackoverflow的「規則」,它可以幫助我們幫助你。 – thelatemail

+0

我現在正在創建一個模擬數據框來向你展示我的意思......我感謝耐心,我將在一個月內完成。 – ejn

回答

8

使用ave多個分組變量,然後用手段代替NA值:

with(data, 
    ave(price, list(upc,state), FUN=function(x) replace(x,is.na(x),mean(x,na.rm=TRUE))) 
) 
# [1] 26.0 28.0 27.0 27.0 23.0 24.0 85.0 84.0 79.5 81.0 78.0 24.0 19.0 98.0 47.0 
6

您可以通過UPC和國家建設的手段矩陣:

meanmtx <- tapply(dat$price, dat[c('upc','state')], mean, na.rm=TRUE) 

這矩陣有個性指數可以與upcstate中的值匹配。因此,然後用2列字符索引把這些在空「插槽」:

dat$price[is.na(dat$price)] <- 
      meanmtx[ cbind(as.character(dat[ is.na(dat$price), 'upc']), 
          as.character(dat[ is.na(dat$price),'state'])) ] 

> dat 
      upc date state price 
1 1153801013 200601  1 26.0 
2 1153801013 200602  1 28.0 
3 1153801013 200603  1 27.0 
4 1153801013 200604  1 27.0 
5 1153801013 200601  2 23.0 
6 1153801013 200602  2 24.0 
7 2105900750 200601  1 85.0 
8 2105900750 200602  1 84.0 
9 2105900750 200603  2 79.5 
10 2105900750 200601  2 81.0 
11 2105900750 200602  2 78.0 
12 2173300001 200603  1 24.0 
13 2173300001 200604  1 19.0 
14 2173300001 200605  1 98.0 
15 2173300001 200606  1 47.0 
4

下面是使用na.aggregate(從zoo)和data.table另一種緊湊的選項。 na.aggregate默認使用感興趣的列的mean替換NA值。如果我們想用medianminmax或其他任何我們想要的來代替NA,它也有一個FUN參數。操作組可以通過dplyr/data.table/base R方法完成。通過data.table,我們將'data.frame'轉換爲'data.table'(setDT(data)),按'upc','state'分組,我們將'price'分配爲(:=)作爲'price'的na.aggregate

library(data.table) 
library(zoo) 
setDT(data)[, price:= na.aggregate(price) , .(upc, state)]