使用R或Excel重整数据

我有一个包含许多行和28列的数据集。

我需要subject IDcoc#列的唯一组合,以及可能被删除的数据放在额外的列中。 我可能不会很好地解释这一点,所以我会展示我的例子:

 ID DOB address name date seen txdone coc# 1 1/08/1997 4blelan bob sager 19/05/2002 1125 45555 1 1/08/1997 4blelan bob sager 19/05/2002 1200 45555 1 1/08/1997 4blelan bob sager 20/06/2003 2000 46666 1 1/08/1997 4blelan bob sager 20/06/2003 1222 46666 2 5/09/1956 55lala Jim reads 19/05/2002 1125 55544 2 5/09/1956 55lala Jim reads 19/05/2002 1111 55544 2 5/09/1956 55lala Jim reads 1/06/2002 1111 55544 2 5/09/1956 55lala Jim reads 2/07/2002 1353 56678 

转化为此

 ID DOB address name dateseen1 txdone1 coc#1 dateseen2 txdone2 coc#2 date seen3 txdone3 coc#3 1 1/08/1997 4blelan bob sager 19/05/2002 1125 45555 19/05/2002 1200 45555 1 1/08/1997 4blelan bob sager 20/06/2003 2000 46666 20/06/2003 1222 46666 2 5/09/1956 55lala Jim reads 19/05/2002 1125 55544 19/05/2002 1111 55544 1/06/2002 1111 55544 2 5/09/1956 55lala Jim reads 2/07/2002 1353 56678 

这样做的原因是我可以在txdonesearch1125 ,但是也可以在COC中完成其他工作。 现在看,我甚至不需要多个coc只是一个 – 但你(或许)的想法。

如果我正在做这个事情,我会非常乐于做不同的事情。 但是,我仅限于使用R和Excel。

你需要一些东西来为每一行创build一个唯一的“id”。 这是一个解决scheme:

 library(splitstackshape) ## For `getanID()` library(reshape2) ## For `melt()` and `dcast()` idvars <- c("ID", "DOB", "address", "name", "coc") mydf2 <- getanID(mydf, idvars) dfL <- melt(mydf2, id.vars=c(idvars, ".id")) dcast(dfL, ID + DOB + address + name + coc ~ variable + .id) # ID DOB address name coc date.seen_1 date.seen_2 date.seen_3 txdone_1 txdone_2 txdone_3 # 1 1 1/08/1997 4blelan bob sager 45555 19/05/2002 19/05/2002 <NA> 1125 1200 <NA> # 2 1 1/08/1997 4blelan bob sager 46666 20/06/2003 20/06/2003 <NA> 2000 1222 <NA> # 3 2 5/09/1956 55lala Jim reads 55544 19/05/2002 19/05/2002 1/06/2002 1125 1111 1111 # 4 2 5/09/1956 55lala Jim reads 56678 2/07/2002 <NA> <NA> 1353 <NA> <NA> 

如果需要,可以稍后重新排列列顺序。


另一种方法是,在不创build“mydf2”的情况下,先使用基本R的reshape() ,然后再按照你想要的顺序join。

 reshape(mydf2, direction = "wide", idvar=idvars, timevar=".id") # ID DOB address name coc date.seen.1 txdone.1 date.seen.2 txdone.2 date.seen.3 txdone.3 # 1 1 1/08/1997 4blelan bob sager 45555 19/05/2002 1125 19/05/2002 1200 <NA> NA # 3 1 1/08/1997 4blelan bob sager 46666 20/06/2003 2000 20/06/2003 1222 <NA> NA # 5 2 5/09/1956 55lala Jim reads 55544 19/05/2002 1125 19/05/2002 1111 1/06/2002 1111 # 8 2 5/09/1956 55lala Jim reads 56678 2/07/2002 1353 <NA> NA <NA> NA 

这是基于mydf被定义为:

 mydf <- read.table(text = 'ID DOB address name "date seen" txdone coc 1 1/08/1997 4blelan "bob sager" 19/05/2002 1125 45555 1 1/08/1997 4blelan "bob sager" 19/05/2002 1200 45555 1 1/08/1997 4blelan "bob sager" 20/06/2003 2000 46666 1 1/08/1997 4blelan "bob sager" 20/06/2003 1222 46666 2 5/09/1956 55lala "Jim reads" 19/05/2002 1125 55544 2 5/09/1956 55lala "Jim reads" 19/05/2002 1111 55544 2 5/09/1956 55lala "Jim reads" 1/06/2002 1111 55544 2 5/09/1956 55lala "Jim reads" 2/07/2002 1353 56678', header = TRUE) 

如果你不想为getanID安装“splitstackshape”(我承诺我不会冒犯),你可以手动生成你的.idvariables(这本质上就是getanID作用):

 X <- do.call(paste, mydf[idvars]) mydf$.id <- ave(X, X, FUN = seq_along) 

在R中,软件包reshape2应该做这个工作。 尝试

 require(reshape2) melt(your_data_frame, id.vars=c("ID", "DOB", "address", "name")) 

(你可以玩id.varsid.vars来得到你想要的精确重塑。)