从R中的现有数据帧中提取数据(或重塑数据帧)

从R中的现有数据帧中提取数据(或重塑数据帧),r,dataframe,R,Dataframe,我有一个我正在使用的大型数据框,前几行如下: Assay Genotype Sample Result 1 001 G 1 0 2 001 A 2 1 3 001 G 3 0 4 001 NA 4 NA 5 002 T

我有一个我正在使用的大型数据框,前几行如下:

      Assay   Genotype   Sample    Result
1     001        G         1         0
2     001        A         2         1
3     001        G         3         0 
4     001        NA        4         NA
5     002        T         1         0
6     002        G         2         1
7     002        T         3         0 
8     002        T         4         0
9     003        NA        1         N
10    003        G         2         1
11    003        G         3         1 
12    003        T         4         0
总的来说,我将处理2000个样本,每个样本进行168次分析。对于每个示例,我希望提取每个示例的“结果”中的数据,以创建一个类似以下内容的列表或数据框:

Sample  Data
   1    00N
   2    111
   3    001
   4    N00
因此,生成的数据帧(或类似的首选数据结构)将是2000行2列。“数据”行将包含168个字符,每个字符对应于每个“分析”


有人能帮我解决这个问题吗?

使用
split
sapply
的基本R解决方案:

sapply(split(dat$Result, dat$Sample), paste, collapse="")

     1      2      3      4 
 "00N"  "111"  "001" "NA00" 

一种方法是使用包
plyr
和基本功能
paste

library(plyr)
ddply(dat, "Sample", summarize, Data = paste(Result, collapse = ""))

  Sample Data
1      1  00N
2      2  111
3      3  001
4      4 NA00
编辑以解决问题

可能我能想到的将NA更改为N的最简单方法是对
ddply
的结果使用
gsub
。注意,我大量借用了@Brian re:ordering提供的非常好的观点。这样做,这是一个好的提示

out <- ddply(dat, "Sample", summarize, Data = paste(Result[order(Assay)], collapse = ""))

  Sample Data
1      1  00N
2      2  111
3      3  001
4      4  N00

请注意,@Chase和@Andrie都假设数据已经按分析排序(您的示例就是这样,所以这不是一个不合理的假设)。如果不是,您仍然可以按正确的顺序获取字符串

调整@Chase的解决方案

library(plyr)
ddply(dat, "Sample", summarize, 
  Data = paste(Result[order(Assay)], collapse = ""))
给予

如果我们使用未排序的数据:

dat.scramble <- dat[sample(nrow(dat)),]

> dat.scramble
   Assay Genotype Sample Result
6    002        G      2      1
1    001        G      1      0
3    001        G      3      0
7    002        T      3      0
10   003        G      2      1
8    002        T      4      0
12   003        T      4      0
5    002        T      1      0
2    001        A      2      1
4    001       NA      4     NA
9    003       NA      1      N
11   003        G      3      1

第四行有轻微的打字错误吗?应该改为NA00吗?实际上我更喜欢最后一个字符串的“NA”缩短为N。如果它更简单的话,我可以接受。一个简单的答案是做
gsub(“NA”,“N”,yourData)
@Chase当我在数据框上运行gsub时,我得到了一种我不知道如何使用的数据格式。这是太长,张贴在这里的评论,但它似乎分裂成两个不同的字符列表我的数据帧。你能告诉我如何维护我的数据帧结构并仍然进行这些更改吗?请参阅我编辑的答案,结合@Brian的观点和上面关于gsub的部分。干杯
  Sample Data
1      1  00N
2      2  111
3      3  001
4      4 NA00
dat.scramble <- dat[sample(nrow(dat)),]

> dat.scramble
   Assay Genotype Sample Result
6    002        G      2      1
1    001        G      1      0
3    001        G      3      0
7    002        T      3      0
10   003        G      2      1
8    002        T      4      0
12   003        T      4      0
5    002        T      1      0
2    001        A      2      1
4    001       NA      4     NA
9    003       NA      1      N
11   003        G      3      1
ddply(dat.scramble, "Sample", summarize, 
  Data = paste(Result[order(Assay)], collapse = ""))

  Sample Data
1      1  00N
2      2  111
3      3  001
4      4 NA00