id <- c(1:8,1:8)
age1 <- c(7.5,6.7,8.6,9.5,8.7,6.3,9,5)
age2 <- age1 + round(runif(1,1,3),1)
age <- c(age1, age2)
tanner <- sample(1:2, 16,replace=T)
d
A little dplyr
and tidyr
does the trick here. arrange
by age so lowest age appear first then use a filter
for duplicated id/tanner then utilize tidyr::spread
df<-
data.frame(
id = c(1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8)
,age = c(7.5, 6.7, 8.6, 9.5, 8.7, 6.3, 9.0, 5.0,10.0, 9.2,11.1,12.0,11.2, 8.8,11.5, 7.5)
,tanner = c(2,1,2,2,1,1,1,1,1,1,1,2,2,2,1,1)
)
library(dplyr)
library(tidyr)
wide <-
df %>%
arrange(age) %>%
filter(!duplicated(paste(id, tanner))) %>%
spread(tanner, age)
colnames(wide) = c('id', 'tanner1', 'tanner2')
wide
# id 1 2
# 1 10.0 7.5
# 2 6.7 NA
# 3 11.1 8.6
# 4 NA 9.5
# 5 8.7 11.2
# 6 6.3 8.8
# 7 9.0 NA
# 8 5.0 NA