繁体   English   中英

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

[英]Extracting data (or reshaping) a data frame from an existing data frame in R

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

      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个字符,每个“测定”中每个字符。

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

使用splitsapply Base 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 = ""))

然后使用gsub

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

等:

  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 = ""))

  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM