2017-11-25 126 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)