2016-06-09 2 views
8

이것은 CSV의 데이터 샘플입니다. 그것은 ~ 10 컬럼을 포함합니다.NA를 이전 발생으로 대체하십시오.

Product_id Product_Weight Product_Name Shop_Name ... 
[1] A    10    xxxx   Walmart 
[2] B    12    yyyy   Target 
[3] C    11    zzzz   Target 
[4] A    NA    xxxx   Walmart 
[5] C    NA    zzzz   Target 

I는 각각 10, 11 행 4 및 5의 NA를 작성하고자하는 (A 및 C의 생성물의 중량은 이미 1 행에서 공지되어 있으므로 3). 나는 마지막 데이터 프레임이

Product_id Product_Weight Product_Name Shop_Name ... 
[1] A    10    xxxx   Walmart 
[2] B    12    yyyy   Target 
[3] C    11    zzzz   Target 
[4] A    10    xxxx   Walmart 
[5] C    11    zzzz   Target 

R에서이 작업을 수행하는 가장 좋은 방법은 무엇입니까처럼되고 싶어? 은 "이전 발생"를 묻는 질문이 어떤 Product_id의 첫 번째 Product_WeightNA 다음 우리가 후속 Product_id에서 Product_Weight을 알고 그래서 대신에 사용하는 경우에도 채울 수없는 한 경우 그 단점이있다 것이지만

+0

Product_id - Product_name 조합이 동일한 가중치를 반환하도록이 가중치가 항상 설정됩니까? – lmo

+0

@lmo 예. 그렇습니다. – Avis

+0

NA 교체에 대한 또 다른 Q & A : http://stackoverflow.com/questions/32694313/handle-continous-missing-values-in-time-series-data – Jaap

답변

5

dplyrtidyr 또 다른 옵션 :

library(dplyr); library(tidyr); 
df %>% group_by(Product_id) %>% fill(Product_Weight) 

Source: local data frame [5 x 4] 
Groups: Product_id [3] 

    Product_id Product_Weight Product_Name Shop_Name 
     (fctr)   (int)  (fctr) (fctr) 
1   A    10   xxxx Walmart 
2   A    10   xxxx Walmart 
3   B    12   yyyy Target 
4   C    11   zzzz Target 
5   C    11   zzzz Target 

결과는 Product_id로 정렬됩니다. 상술 한 dplyr/tidyr 용액으로서

# create lookup table with item and weight combinations 
lookup<-unique(df[complete.cases(df[ ,1:2]),]) 

#  find the NAs needing replacement: which(is.na(df$weight)) 
#  find index in lookup tabe:match(df$a[which(is.na(df$weight)) 
#  subset: df$weight[which(is.na(df$weight)) 
df$weight[which(is.na(df$weight))]<-lookup$weight[match(df$Product_id[which(is.na(df$weight))], lookup$Product_id)] 

가장 가능성이 효율적이지 : 여기

+0

can not dplyr 재주문없이 이것을 수행합니까? – rawr

9

이전의 발생은 동일한 비 -NAAs의 평균을 취한다. Product_id. 이들은 모두 동일해야하기 때문에 그들의 평균은 그들의 공통 가치입니다.

당신이 정말로 이전 발생이 Prev 기능을 사용하고자 할 경우 여기서의 na.aggregate 대신

Prev <- function(x) na.locf(x, na.rm = FALSE) 

(1)과 (3)과 (2)를 사용하지 마십시오.

다음 솔루션은 모두 장점이 있습니다

  • 입력의 순서를 유지 어떤 Product_id의 첫 Product_Weight

  • 하지 NA

    경우에도

  • 일 입력을 수정하십시오.

첫 번째 솔루션은 단 한 줄의 코드 (추가로 library 문)의 추가 이점이 있으며 두 번째 솔루션은 패키지를 사용하지 않는 추가 이점이 있습니다.

1) 동물원 :: na.aggregate 우리는 비 NAS의 평균 모든 NAS를 대체 ​​동물원 패키지 (에 na.aggregate 사용) 우리는 각 Product_id에 대해 개별적으로 Product_Weight에 적용합니다.

library(zoo) 
transform(DF, Product_Weight = ave(Product_Weight, Product_id, FUN = na.aggregate)) 

제공 :

Product_id Product_Weight Product_Name Shop_Name 
1   A    10   xxxx Walmart 
2   B    12   yyyy Target 
3   C    11   zzzz Target 
4   A    10   xxxx Walmart 
5   C    11   zzzz Target 

2) Mean는 다음과 같이 정의된다 없음 패키지 대안 na.aggregate 대신에 Mean을 사용하지 :

Mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE)) 

3) dplyr/동물원 추가 행 번호, 그룹 Product_id에 의해, Mean 이하이거나 도시 된 바와 같이 하나 na.aggregate를 사용하여 종래의 솔루션에서와 NAS는, 원래의 순서로 배열되고 행 번호 제거 :

library(dplyr) 
library(zoo) 

DF %>% 
    mutate(row = row_number()) %>% 
    group_by(Product_id) %>% 
    mutate(Product_Weight = na.aggregate(Product_Weight)) %>% 
    ungroup() %>% 
    arrange(row) %>% 
    select(-row) 

참고

Lines <- " Product_id Product_Weight Product_Name Shop_Name 
    A    10    xxxx   Walmart 
    B    12    yyyy   Target 
    C    11    zzzz   Target 
    A    NA    xxxx   Walmart 
    C    NA    zzzz   Target" 
DF <- read.table(text = Lines, header = TRUE) 
:
이 입력 DF에 사용 된
2

베이스 R 명령으로 용액이다.

관련 문제