使用R或Excel重塑数据
我有一个包含许多行和28列的数据集 我需要使用R或Excel重塑数据,r,excel,reshape,R,Excel,Reshape,我有一个包含许多行和28列的数据集 我需要主题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/2
主题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
中搜索1125
,但也可以在一行中获得在COC
中执行的其他工作。现在来看,我甚至不需要多个coc
列,只需要一个列——但你知道了(也许)
如果我在这件事上倒退的话,我会很乐意以不同的方式做事。但是,我仅限于使用R和Excel。在R中,包
重塑2
应该可以完成这项工作。试一试
require(reshape2)
melt(your_data_frame, id.vars=c("ID", "DOB", "address", "name"))
(你可以使用
id.vars
和measure.vars
来获得你想要的精确形状。)你需要一些东西来为每一行创建一个唯一的“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>
这是基于
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)
这个问题是一个典型的例子,说明没有在当前状态下实际上是唯一的ID。需要一个“时间”变量来使ID变量唯一。这太棒了!我能看到这一切是如何结合在一起的。我真的很担心这会变得更加困难,我会尝试将此应用于我的完整数据集,看看我会怎么做。谢谢是否可以将列表传递给
dcast
,或者我只需要键入所有我想添加的a+b+c+d+etc…
@Caldweld,我想你可以使用公式。如果您已经像我在回答中那样创建了idvars
对象,那么您可以执行类似fmla的操作
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)
X <- do.call(paste, mydf[idvars])
mydf$.id <- ave(X, X, FUN = seq_along)