У меня есть дф:
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')
Я уверен, что есть более эффективный способ, особенно потому, что вероятность ошибок очень высока, когда я включаю данные за другие годы.
Какие-либо предложения?
Мы можем 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
Мы можем сделать это с помощью dcast
from 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