从R中的现有数据帧中提取数据(或重新整形)数据帧

时间:2011-10-11 21:00:00

标签: 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         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个分析。对于每个样本,Id喜欢为每个样本提取“结果”中的数据,以创建如下所示的列表或数据框:

Sample  Data
   1    00N
   2    111
   3    001
   4    N00

结果数据帧(或类似的优选数据结构)因此将是2000行和2列。 “数据”行每个'Assay'将包含168个字符。

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

3 个答案:

答案 0 :(得分:3)

使用splitsapply的基础R解决方案:

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

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

答案 1 :(得分:3)

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的最简单方法是对gsub的结果使用ddply。注意我很自由地借用@Brian re提供的非常好的点:order。这样做,这是一个很好的提示!

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

然后使用gsub

out$Data <- gsub("NA", "N", out$Data)

et voila:

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

答案 2 :(得分:1)

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

改编@ Chase的解决方案

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

给出

  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