根据行名R将数据帧重新排序为列

时间:2015-11-17 00:06:26

标签: r if-statement

初学者问题来了,对不起......我有一个结构如下的数据集:

dat.1<-data.frame(id=c(1,1,1,2,2,2),test=c("test.1","test.2","test.3"),result=c(1,2,1,2,2,1))
dat.1
  id   test result
1  1 test.1      1
2  1 test.2      2
3  1 test.3      1
4  2 test.1      2
5  2 test.2      2
6  2 test.3      1

实际数据集当前具有32个测试,并且1000&lt; ID号,结果总是二进制 - 测试数量可以增加,ID也是如此。我想重新安排数据,以便每个测试,即测试1&#39;有一个像这样的列:

dat.3<-data.frame(id=c(1,2),test.1=c(1,2),test.2=c(2,2),test.3=c(1,1))
dat.3
  id test.1 test.2 test.3
1  1      1      2      1
2  2      2      2      1

这方面的一个小问题是并非每个ID都经历过每次测试,因此任何解决方案都必须应对NA。为了在dat.3中澄清,测试的列内容是dat.1的结果列。

目前我已经创造了一个空洞的&#39;数据框可以适应新的测试,如下所示:

dat.2<-data.frame(id=c(1,2),test.1=c(NA,NA),test.2=c(NA,NA),test.3=c(NA,NA))
dat.2
  id test.1 test.2 test.3
1  1     NA     NA     NA
2  2     NA     NA     NA

我一直在试验ifelse和IF dat的逻辑。$ id == dat.2 $ id&amp; dat.1 $测试==&#34; test.1&#34;那么dat.2 col = test.1,输入dat.1 $得到dat.3 $ test.1 - 如果这有任何意义的话!可以预见的是,我没有运气,觉得我错过了一个非常明显的步骤/过于复杂的事情,所以任何帮助都会非常感激 - 谢谢

编辑:感谢您的评论 - 重塑已经开始有所帮助;但是,我想我试图用上面的例子过度简化。我在下面放了一个新的示例数据集:

dat.4<-data.frame(id=c(1,1,1,1,1,1,2,2,2),result=c(1,1,1,2,2,2,3,3,3),
test=c("test.1","test.2","test.3"),result=c(1,2,1,2,2,2,2,2,1))
dat.1
  id result   test result.1
1  1      1 test.1        1
2  1      1 test.2        2
3  1      1 test.3        1
4  1      2 test.1        2
5  1      2 test.2        2
6  1      2 test.3        2
7  2      3 test.1        2
8  2      3 test.2        2
9  2      3 test.3        1

因此,每个ID(实际上是一个样本ID)都有一个测试,它已经为这个进一步的测试提供了资格 - 这个测试可以有一个或多个结果。因此,在上面的示例中,最终的数据结构如下所示:

dat.3<-data.frame(id=c(1,1,2),result=c(1,2,3),test.1=c(1,2,2),test.2=c(2,2,2),
test.3=c(1,2,1))
dat.3
  id result test.1 test.2 test.3
1  1      1      1      2      1
2  1      2      2      2      2
3  2      3      2      2      1

所以我真正想要的是基于两个柱状况的重塑 - 这是否有意义?

1 个答案:

答案 0 :(得分:1)

进一步了解 - 答案是在R手册中(不知道我错过了它) reshape manual

所以在上面的例子中,

dat.2<-reshape(dat.1,idvar=c("id","result"),timevar="test",direction="wide")

dat.2
  id result result.1.test.1 result.1.test.2 result.1.test.3
1  1      1               1               2               1
4  1      2               2               2               2
7  2      3               2               2               1