使用R或Excel重整数据
我有一个包含许多行和28列的数据集。
我需要subject ID
和coc#
列的唯一组合,以及可能被删除的数据放在额外的列中。 我可能不会很好地解释这一点,所以我会展示我的例子:
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
这样做的原因是我可以在txdone
search1125
,但是也可以在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”(我承诺我不会冒犯),你可以手动生成你的.id
variables(这本质上就是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.vars
和id.vars
来得到你想要的精确重塑。)