我有一个大数据框,我正在使用,前几行如下:
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个字符。
有人可以帮我解决这个问题吗?
答案 0 :(得分:3)
使用split
和sapply
的基础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