2017-12-23 1 views
3

R 데이터 처리 문제가 있습니다. readr을 사용하여로드 할 수있는 .csv 파일에 많은 양의 데이터 집합이 있습니다. 문제는 데이터 프레임에 추가해야하는 누락 된 값이 있다는 것입니다.데이터 프레임의 순차 값을 입력하십시오.

예 데이터 :

X1 X2 Value 
Coal 1  300 
Coal 3  100 
Coal 5  150 
NatG 2  175 
NatG 4  150 

이 파일이 제대로에서로드됩니다. 그러나 최종 데이터 프레임에 모든 X1 유형 및 누락 된 값이 0으로 설정된 X2의 전체 시퀀스 1 : 5에 대한 항목이 포함되도록 처리를 추가하려고합니다. 마지막 dataframe은 다음과 같이 싶습니다

X1 X2 Value 
Coal 1  300 
Coal 2  0 
Coal 3  100 
Coal 4  0 
Coal 5  150 
NatG 1  0 
NatG 2  175 
NatG 3  0 
NatG 4  150 
NatG 5  0 

I가 0 다음 동일한 데이터 프레임에 대한 실제 데이터를 읽어들이는 모든 항목을 한 파일에로드 readr를 사용하여 시도하지만 파괴 덮어 쓰기이었다 누락 된 행이 제거되었습니다. X1에서 각 값에 대해 1 : 5 시퀀스의 값이 누락된다는 것을 모른 채 데이터 프레임에 적절한 행을 추가하는 방법을 알아야합니다.

+0

doriengard; 나중에 편집하기 위해 예제 데이터를 추가하고 코드 블럭 (회색으로 표시)에 각 행을 4 칸씩 표시하거나 원하는 코드를 강조 표시하고'{} '아이콘을 클릭하십시오. – user20650

+0

아마도 유용 할 수 있습니다. https://stackoverflow.com/questions/10438969/fastest-way-to-add-rows-for-missing-values-in-a-data-frame; https://stackoverflow.com/questions/41007851/expanding-long-format-time-series-data-with-missing-rows; 주어진 www의 답변 https://stackoverflow.com/questions/39961798/how-to-complete-missing-factor-levels-in-data-frame; https://stackoverflow.com/questions/32874239/how-do-i-use-tidyr-to-fill-in-completedrows-within-each-value-of-a-grouping-var – user20650

답변

4

패키지의 complete 기능을 사용할 수 있습니다. complete 함수는 제공된 열을 기반으로 조합을 만듭니다. fill 인수는 채우기 값을 지정할 수 있습니다.

library(tidyr) 

dt2 <- dt %>% 
    complete(X1, X2, fill = list(Value = 0)) 
dt2 
# # A tibble: 10 x 3 
#  X1 X2 Value 
# <chr> <int> <dbl> 
# 1 Coal  1 300 
# 2 Coal  2  0 
# 3 Coal  3 100 
# 4 Coal  4  0 
# 5 Coal  5 150 
# 6 NatG  1  0 
# 7 NatG  2 175 
# 8 NatG  3  0 
# 9 NatG  4 150 
# 10 NatG  5  0 

일부 그룹 값이없는 경우 조합에 대한 그룹 값을 지정할 수도 있습니다. 예를 들어, 다음을 수행하여 X2 열의 1 - 5가 모두 고려되었는지 확인할 수 있습니다.

dt2 <- dt %>% 
    complete(X1, X2 = 1:5, fill = list(Value = 0)) 

또는 자동 컬럼의 최소 및 최대 값에 기초하여 시퀀스를 생성 할 full_seq를 사용한다. tidyr와 @www에서

dt2 <- dt %>% 
    complete(X1, X2 = full_seq(X2, period = 1), fill = list(Value = 0)) 

데이터

dt <- read.table(text = "X1 X2 Value 
Coal 1  300 
       Coal 3  100 
       Coal 5  150 
       NatG 2  175 
       NatG 4  150", 
       header = TRUE, stringsAsFactors = FALSE) 
2

훌륭한 솔루션입니다. 이것은베이스 R에서 수행하는 방법입니다.

levels <- 1:5 

type <- c("Coal", "NatG") 

df2 <- expand.grid(levels,type) 

df3 <- merge(dt, df2, by.x=c("X1","X2"), by.y=c("Var2","Var1"),all.y=T) 

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

    X1 X2 Value 
1 Coal 1 300 
2 Coal 2  0 
3 Coal 3 100 
4 Coal 4  0 
5 Coal 5 150 
6 NatG 1  0 
7 NatG 2 175 
8 NatG 3  0 
9 NatG 4 150 
10 NatG 5  0 
+0

작동하도록했습니다. ,하지만 작은 추가. [readr]을 사용하여 .csv 파일에서 데이터를 읽으면 초기 입력이 데이터 프레임이되었습니다. 먼저 [data.table] 패키지에서 [setDT]를 사용하여 data.table로 변경해야했습니다. 이렇게하면 두 솔루션이 모두 작동합니다. – doriengard

+0

여기에는'data.table'이 필요하지 않습니다. 'dt'' as.data.frame'을 설정해야 할 수도 있지만, 그게 전부입니다. 나는 당신이 사용한 것이기 때문에'dt'를 기본 테이블의 이름으로 사용했습니다. – Mako212

관련 문제