Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 拆分列的数据并将它们放置到两个连续的行中以进行相同的观察_R_Dataframe_Dplyr - Fatal编程技术网

R 拆分列的数据并将它们放置到两个连续的行中以进行相同的观察

R 拆分列的数据并将它们放置到两个连续的行中以进行相同的观察,r,dataframe,dplyr,R,Dataframe,Dplyr,我有一个名为SNP的数据框架,有6000列和500行。数据框如下表所示: |sample | SNP1 | SNP2 | SNP3 | |:--------------|---------:|---------:|---------:| |s1 | AA | TT | GG | |s2 | CC | AT | AA |

我有一个名为SNP的数据框架,有6000列和500行。数据框如下表所示:

|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    |