1

我有一个包含许多行和 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

这样做的原因是我可以在其中搜索1125,但也可以在一行txdone中获得在其中进行的其他工作。COC现在看它,我什至不需要coc一个多列——但你明白了(也许)。

如果我倒退的话,我很愿意以不同的方式做事。但是,我仅限于使用 R 和 Excel。

4

2 回答 2

0

在 R 中,包reshape2应该可以完成这项工作。尝试

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

(您可以尝试id.varsmeasure.vars获得所需的精确重塑。)

于 2013-09-09T02:41:20.943 回答
0

您将需要一些东西来为每一行创建一个唯一的“id”。这是一个解决方案:

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>

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


或者,melt在创建“mydf2”之后,先不使用长格式,reshape()从基础 R 使用(作为奖励,列按您想要的顺序排列)。

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)

如果您不想仅仅为了安装“splitstackshape” getanID(我保证不会被冒犯),您可以.id按如下方式手动生成变量(这基本上就是getanID这样做的):

X <- do.call(paste, mydf[idvars])
mydf$.id <- ave(X, X, FUN = seq_along)
于 2013-09-09T03:16:49.047 回答