合并不同维度r

时间:2019-05-30 12:25:50

标签: r list merge split

我有一个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')

我确信有一种更有效的方法,特别是一旦包含其他年份的数据,出错的可能性就很高。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

我们可以将gather数据制成长格式,但不包括yearArea列,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