重塑R宽到长的重复测量数据 [英] Reshaping repeated measures data in R wide to long

查看:9
本文介绍了重塑R宽到长的重复测量数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要将个人每年重复测量的"宽"数据帧转换为"长"格式,以便我可以将其建模为lm(y_Year 2~x_Year 1)和lm(z_Year 2~y_Year 2)

我可以"手动"将其转换为我想要的格式,但不知道如何melt/dcast将其转换为我想要的形状

下面我演示了如何处理一些模拟数据

数据帧格式如下,每行一个

ID  SITE    L_03  M_03  R_03  L_04  M_04  R_04  L_05  M_05  R_05
1   forest    X     a   YES     Y     b   YES     Z     c   NO
2   forest    ... 

我想要长格式的:

ID  SITE    L_year1  L_year2  M_year1  M_year2  R_year1   R_year2   year1  year2
1   forest      Z       Y       a         b       YES       YES       03    04
1   forest      Y       Z       b         c       YES       NO        04    05
2   forest      ...  
2   forest      ...

部分模拟数据: L和M是数字(长度和质量),R是是/否系数(繁殖),3年重复测量(2003-2005)

    ID <- 1:10; SITE <- c(rep("forest",3), rep("swamp",3), rep("field",4))
    L_03 <- round(rnorm(10, 100, 1),3) ; M_03 <- round((10 + L_03*0.25 + rnorm(10, 0, 1)), 3)
    R_03 <- sample(c("Yes", "No"), 10, replace = TRUE) ; L_04 <- round((2 + L_03*1.25 + rnorm(10, 1,10)), 3) 
    M_04 <- round((10 + L_04*0.25 + rnorm(10, 0,10)), 3) ;R_04 <- sample(c("Yes", "No"), 10, replace = TRUE)
    L_05 <- round((2 + L_04*1.25 + rnorm(10, 1,10)),3) ; M_05 <- round((10 + L_05*0.25 + abs(rnorm(10, 0,10))),3)
    R_05 <- sample(c("Yes", "No"), 10, replace = TRUE); rm_data <- data.frame(ID, SITE, L_03, M_03, R_03, L_04, M_04,R_04, L_05, M_05, R_05)

方法1:我的临时重塑rbind 首先,使用2003&;2004数据创建子集,然后使用2004&;2005数据创建另一个子集

rm_data1 <- cbind(rm_data[ ,c(1,2,3:5, 6:8)], rep(2003,10), rep(2004,10))
rm_data2 <- cbind(rm_data[ ,c(1,2,6:8, 9:11)],rep(2004,10), rep(2005,10))
names(rm_data1)[3:10]<- c("L1", "M1", "R1", "L2", "M2", "R2", "yr1", "yr2")
names(rm_data2)[3:10]<- c("L1", "M1", "R1", "L2", "M2", "R2", "yr1", "yr2")
data3 <- rbind(rm_data1, rm_data2)

方法2?:我希望使用reshape/melt/dcast来完成此操作。我不知道我是否可以直接在宽数据帧上使用dcast,或者一旦我melt它,如何将它转换为我想要的格式。

library(reshape2)
rm_measure_vars <- c("L_03", "M_03", "R_03", "L_04", "M_04","R_04", "L_05", "M_05", "R_05")
rm_data_melt <-  melt(data = rm_data, id.vars = c("ID", "SITE"), measure.vars = rm_measure_vars, value.name = "data")

我添加了对熔化数据进行测量的年份的指示符

obs_year <- gsub("(.*)([0-9]{2})", "\2", rm_data_melt$variable)
rm_data_melt <- cbind(rm_data_melt, obs_year)

dcast看起来应该是这样的,但这还不是我需要的

dcast(data = rm_data_melt, formula = ID + SITE + obs_year ~ variable)
   ID   SITE obs_year    L_03   M_03 R_03    L_04   M_04 R_04    L_05   M_05 R_05
1   1 forest       03   99.96 35.364   No    <NA>   <NA> <NA>    <NA>   <NA> <NA>
2   1 forest       04    <NA>   <NA> <NA> 129.595 47.256  Yes    <NA>   <NA> <NA>
3   1 forest       05    <NA>   <NA> <NA>    <NA>   <NA> <NA> 177.607 58.204  Yes

如有任何建议,我们将不胜感激

推荐答案

我试了一下。reshape是最容易的部分。剩下的需要一些半手工处理,我想。以下内容应该会满足您的需求。

output <- reshape(rm_data, idvar=c("ID","SITE"), varying=3:11, 
                v.names=c("L_","M_","R_"), direction="long")
output$time <- output$time + 2    # to get the year
names(output)[3:6] <- c("year1", "L_year1", "M_year1", "R_year1")
output$year2 <- output$year1+1
rownames(output) <- c()

sapply(output[,4:6], function(x) {
  i <- ncol(output)+1
  output[,i] <<- x[c(2:length(x), NA)]
  names(output)[i] <<- sub("1","2",names(output)[i-4])
})

output <- output[,c(1,2,4,8,5,9,6,10,3,7)]    # rearrange columns as necessary

希望这能有所帮助!

这篇关于重塑R宽到长的重复测量数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆