使用R或Excel重塑数据

时间:2013-09-09 02:30:40

标签: r excel reshape

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

原因是我可以在1125中搜索txdone,但也可以在COC一行中完成其他工作。现在看一下,我甚至不需要多列coc只有一列 - 但你明白了(也许)。

如果我向后退一步,我会非常愿意做不同的事情。但是,我只能使用R和Excel。

2 个答案:

答案 0 :(得分:0)

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

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

(您可以使用id.varsmeasure.vars来获得所需的精确重塑。)

答案 1 :(得分: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”后,使用基础R中的reshape()(作为奖励,列按您想要的顺序排列)。

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变量,如下所示(这基本上是什么) getanID无论如何都会这样做:

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