[英]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个字符,每个“测定”中每个字符。
有人可以帮我解决这个问题吗?
使用split
和sapply
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.