2016-01-19 45 views
1

我的工作具有以下結構的一些世界銀行的面板數據(與NA值):重塑世界銀行的數據格式

df <- read.table(text=" 
    Indicator Country 1996 1997 1998 
    X   A  v1 NA v3 
    X   B  v4 v5 v6 
    X   C  NA v8 v9 
    Y   A  z1 NA z3 
    Y   B  NA NA z6 
    Y   C  z7 z8 z9", header = TRUE) 

,我也期待獲得這樣的結構:

Country Year X Y 
    A  1996 v1 z1 
    A  1997 NA NA 
    A  1998 v3 z3 
    B  1996 v4 NA 
    B  1997 v5 NA 
    B  1998 v6 z6 
    C  1996 NA z7 
    C  1997 v8 z8 
    C  1998 v9 z9 

我試着在Reshaping data.frame from wide to long format用下面的代碼中給出的答案:

df.reshaped=reshape(df, direction="long", varying=list(names(df)[3:5]), 
    v.names=c("X", "Y"), idvar= "Country", times=1996:1998) 

,但沒有得到我想要的。 真正的平面文件包含近20個指標* 214個國家* 35年,所以尋找你的幫助。

回答

1

我們可以使用melt/dcast

library(data.table) 
dcast(melt(setDT(df), id.var=c("Indicator", "Country"), 
    variable.name="year"), 
     Country+year~Indicator, value.var='value') 
# Country year X Y 
#1:  A 1996 v1 z1 
#2:  A 1997 NA NA 
#3:  A 1998 v3 z3 
#4:  B 1996 v4 NA 
#5:  B 1997 v5 NA 
#6:  B 1998 v6 z6 
#7:  C 1996 NA z7 
#8:  C 1997 v8 z8 
#9:  C 1998 v9 z9 
+1

太棒了!謝謝。 – Houssem

+1

@Houssem,這可能是一個更快/更好/更靈活的答案。您可能需要重新考慮複選標記,並考慮對我的答案進行投票。 – A5C1D2H2I1M1N2O1R2T1

+0

@AnandaMahto,沒有真正理解你,我是這個論壇的新成員。感謝你和'akrun'。 – Houssem

2

僅供參考,你可以做基礎R類似的東西與reshape + stack的組合:

reshape(cbind(df[c(1, 2)], 
       stack(lapply(df[-c(1, 2)], as.character))), 
     direction = "wide", 
     idvar = c("Country", "ind"), 
     timevar = "Indicator") 
# Country ind values.X values.Y 
# 1  A 1996  v1  z1 
# 2  B 1996  v4  <NA> 
# 3  C 1996  <NA>  z7 
# 7  A 1997  <NA>  <NA> 
# 8  B 1997  v5  <NA> 
# 9  C 1997  v8  z8 
# 13  A 1998  v3  z3 
# 14  B 1998  v6  z6 
# 15  C 1998  v9  z9 

而且,在Hadleyverse®,與gather and spread

library(dplyr) 
library(tidyr) 
df %>% 
    gather(Year, value, -Country, -Indicator) %>% 
    spread(Indicator, value) 
# Country Year X Y 
# 1  A 1996 v1 z1 
# 2  A 1997 <NA> <NA> 
# 3  A 1998 v3 z3 
# 4  B 1996 v4 <NA> 
# 5  B 1997 v5 <NA> 
# 6  B 1998 v6 z6 
# 7  C 1996 <NA> z7 
# 8  C 1997 v8 z8 
# 9  C 1998 v9 z9