从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