Converting long to wide format

后端 未结 3 1365
北海茫月
北海茫月 2021-01-24 02:22
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         


        
3条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-24 02:44

    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
    

提交回复
热议问题