我有一个包含许多行和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。
答案 0 :(得分:0)
在R中,包reshape2
应该完成这项工作。尝试
require(reshape2)
melt(your_data_frame, id.vars=c("ID", "DOB", "address", "name"))
(您可以使用id.vars
和measure.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)