R 拆分列的数据并将它们放置到两个连续的行中以进行相同的观察
我有一个名为SNP的数据框架,有6000列和500行。数据框如下表所示:R 拆分列的数据并将它们放置到两个连续的行中以进行相同的观察,r,dataframe,dplyr,R,Dataframe,Dplyr,我有一个名为SNP的数据框架,有6000列和500行。数据框如下表所示: |sample | SNP1 | SNP2 | SNP3 | |:--------------|---------:|---------:|---------:| |s1 | AA | TT | GG | |s2 | CC | AT | AA |
|sample | SNP1 | SNP2 | SNP3 |
|:--------------|---------:|---------:|---------:|
|s1 | AA | TT | GG |
|s2 | CC | AT | AA |
|s3 | AT | CC | AA |
我必须重新安排分析的格式。我想做的是,对于每个SNP列中的每个字符(例如,第二列的“AA”、“CC”、“AT”,SNP1),我想为每个样本创建两个连续的行,然后将字符拆分并分配到新创建的两行中。
为方便起见,我希望采用下表格式:
|sample | SNP1 | SNP2 | SNP3 |
|:--------------|---------:|---------:|---------:|
|s1 | A | T | G |
|s1 | A | T | G |
|s2 | C | A | A |
|s2 | C | T | A |
|s3 | A | C | A |
|s3 | T | C | A |
如果有人能帮我解决问题,我将不胜感激
注意:我添加了datafram的屏幕截图,以防我添加的格式被替换,我在这里是新的。这里有一个可能的解决方案,使用
tidyverse
包和正则表达式:
library(tidyverse)
snp <- data.frame(sample = c("s1", "s2", "s3"),
SNP1 = c("AA", "CC", "AT"),
SNP2 = c("TT", "AT", "CC"),
SNP3 = c("GG", "AA", "AA"))
snp %>% mutate_at(-1, ~str_extract(.x, "^.")) %>%
bind_rows(mutate_at(snp, -1, ~str_extract(.x, ".$"))) %>%
arrange(sample)
sample SNP1 SNP2 SNP3
1 s1 A T G
2 s1 A T G
3 s2 C A A
4 s2 C T A
5 s3 A C A
6 s3 T C A
库(tidyverse)
snp%在(-1,~str提取(.x,“^.”)处突变%>%
绑定行(在(snp,-1,~str\u extract(.x,“.$”)处进行变异)%>%
安排(样本)
样本SNP1 SNP2 SNP3
1 s1 A T G
2 s1 A T G
3 s2 C A
4 s2 C T A
5 s3 A C A
6 s3 T C A
简短说明:首先,我提取除第一列之外的所有列的第一个字母(^.
)(因此-1
)。
然后提取除第一列之外的所有列的最后一个字母(
$
)。最后,我将这两个data.frames粘贴在一起,并使用arrange
重新排列结果。这是一个漂亮的data.table
解决方案
你会发现这篇文章很有启发性。
输出:
|sample |SNP1 |SNP2 |SNP3 |
|:------|:----|:----|:----|
|s1 |A |T |G |
|s1 |A |T |G |
|s2 |C |A |A |
|s2 |C |T |A |
|s3 |A |C |A |
|s3 |T |C |A |
如果字符串是固定长度,但不一定是长度2,这似乎仍然有效。我没有在空字符串上测试这个。买主警告到目前为止您尝试了什么?我第一次尝试使用tidyverse软件包的单独功能,但没有成功,所以我请求帮助。我的原始解决方案融化并重新创建了数据表。非常感谢@Cettt
|sample |SNP1 |SNP2 |SNP3 |
|:------|:----|:----|:----|
|s1 |A |T |G |
|s1 |A |T |G |
|s2 |C |A |A |
|s2 |C |T |A |
|s3 |A |C |A |
|s3 |T |C |A |