2017-11-25 98 views
0

我想切分幾行並將數據添加回數據集中作爲另一個變量。所以我的任務是這樣的...轉換將行切片並放回R中作爲變量

location year value 
aus  1990 1 
aus  1991 2 
aus  1992 2 
usa  1990 1 
usa  1991 3 
usa  1992 2 
uk  1990 3 
uk  1991 2 
uk  1992 2 
...  

into something like this 

year value_aus value_usa value_uk 
1990  1   1   3 
1991  2   3   2 
1992  2   2   2 
. 
. 
. 

我的數據有56年,爲36個不同的國家。

我試過如下..

nations<-factor(data$LOCATION) 
nationlist<-nations[!duplicated(nations)] 


data_w<-data.frame(year=data$TIME[data$LOCATION==nationlist[1]]) 

for(loc in c(as.character(nationlist))){ 
    data_w<-data.frame(data_w[,], loc = data$Value[data$LOCATION==loc], check.rows=TRUE) 
    } 

但這並沒有工作,吐出「的參數意味着不同的行號:54 56」,因爲一些國家有不同的若干意見(年在這種情況下)我猜。

任何幫助將不勝感激。

Jinseok

+2

,我認爲這是不手動變換長格式轉換成寬幅好主意。 'tidyr :: spread(your_data,location,value)'會給你想要的東西(參見'help(spread,tidyr)')。 – cuttlefish44

+0

@墨魚魚哇!它完美的作品!非常感謝。 –

回答

0

使用dplyrtidyr溶液。關鍵是使用spread將數據幀從長格式轉換爲寬格式。 setNames(sub("location", "value", colnames(.))) 只是將列名稱更改爲與所需的輸出相同。

library(dplyr) 
library(tidyr) 

dt2 <- dt %>% 
    spread(location, value, sep = "_") %>% 
    setNames(sub("location", "value", colnames(.))) 
dt2 
# year value_aus value_uk value_usa 
# 1 1990   1  3   1 
# 2 1991   2  2   3 
# 3 1992   2  2   2 

DATA

dt <- read.table(text = "location year value 
aus  1990 1 
       aus  1991 2 
       aus  1992 2 
       usa  1990 1 
       usa  1991 3 
       usa  1992 2 
       uk  1990 3 
       uk  1991 2 
       uk  1992 2 
       ", 
       header = TRUE, stringsAsFactors = FALSE)