我有一个df:
df= data.frame(year=c(rep(2018,4),rep(2017,3)),Area=c(1:4,1:3),P=1:7,N=1:7)
我想将其按年份划分,然后将所有内容再次合并在一起,以便将年份视为每个区域的列。为了做到这一点,我将拆分并合并:
s=split(df,df$year)
m=merge(s[[1]][,2:4],[s[[2]][,2:4],by='Area',all=1)
colnames(m)=c('area','P2018','C2018','P2017','C2017')
我确信有一种更有效的方法,特别是一旦包含其他年份的数据,出错的可能性就很高。
有什么建议吗?
答案 0 :(得分:2)
我们可以将gather
数据制成长格式,但不包括year
和Area
列,unite
year
,然后将spread
转换为宽格式
library(dplyr)
library(tidyr)
df %>%
gather(key, value, -year, -Area) %>%
unite(key, key, year, sep = "") %>%
spread(key, value)
# Area N2017 N2018 P2017 P2018
#1 1 5 1 5 1
#2 2 6 2 6 2
#3 3 7 3 7 3
#4 4 NA 4 NA 4
答案 1 :(得分:1)
我们可以使用dcast
中的data.table
来完成此操作,这可能需要多个value.var
列
library(data.table)
dcast(setDT(df), Area ~ year, value.var = c("P", "N"))
# Area P_2017 P_2018 N_2017 N_2018
#1: 1 5 1 5 1
#2: 2 6 2 6 2
#3: 3 7 3 7 3
#4: 4 NA 4 NA 4