将行切片并放回R中作为变量
问题描述:
我想切分几行并将数据添加回数据集中作为另一个变量。所以我的任务是这样的...转换将行切片并放回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
答
使用dplyr
和tidyr
溶液。关键是使用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)
,我认为这是不手动变换长格式转换成宽幅好主意。 'tidyr :: spread(your_data,location,value)'会给你想要的东西(参见'help(spread,tidyr)')。 – cuttlefish44
@墨鱼鱼哇!它完美的作品!非常感谢。 –