Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用R或Excel重塑数据_R_Excel_Reshape - Fatal编程技术网

使用R或Excel重塑数据

使用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

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