Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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 - Fatal编程技术网

R 是否有一种方法可以将多行分散到多个列中?

R 是否有一种方法可以将多行分散到多个列中?,r,R,我是一个初学者,所以道歉,如果这不是很流利。我想分散我的数据,以便一个示例文件的所有变量都在一行中。我的数据(RW_leftjoin)当前看起来像这样: Sample_File Marker Peak Allele Height 1: A02_1710963103.fsa AMEL 1 X 5137 2: A02_1710963103.fsa AMEL 2 Y 4898 3: A02_1710963103.f

我是一个初学者,所以道歉,如果这不是很流利。我想分散我的数据,以便一个示例文件的所有变量都在一行中。我的数据(RW_leftjoin)当前看起来像这样:

           Sample_File   Marker Peak Allele Height
 1: A02_1710963103.fsa     AMEL    1      X   5137
 2: A02_1710963103.fsa     AMEL    2      Y   4898
 3: A02_1710963103.fsa   CSF1PO    1     11    805
 4: A02_1710963103.fsa   CSF1PO    2     12    652
Sample_File          AMEL1 AMEL2 Height1 Height2 CSF1PO1 CSF1PO1 Height1 Height2
 1: A02_1710963103.fsa    X    Y    5137    4898    11    12      805    652
rowid Sample_File    Marker    Peak Height AMEL1 AMEL2 CSF1PO1 CSF1PO2
   <int> <chr>              <chr>    <dbl> <chr>  <chr> <chr> <chr>   <chr>  
 1    1 A02_1710963103.fsa AMEL    1 5137    X    NA    NA      NA     
 2    2 A02_1710963103.fsa AMEL    2 4898   NA    Y     NA      NA     
 3    3 A02_1710963103.fsa CSF1PO    1 805    NA    NA    11    NA     
 4    4 A02_1710963103.fsa CSF1PO    2 652    NA    NA    NA    12
我希望我的数据如下所示:

           Sample_File   Marker Peak Allele Height
 1: A02_1710963103.fsa     AMEL    1      X   5137
 2: A02_1710963103.fsa     AMEL    2      Y   4898
 3: A02_1710963103.fsa   CSF1PO    1     11    805
 4: A02_1710963103.fsa   CSF1PO    2     12    652
Sample_File          AMEL1 AMEL2 Height1 Height2 CSF1PO1 CSF1PO1 Height1 Height2
 1: A02_1710963103.fsa    X    Y    5137    4898    11    12      805    652
rowid Sample_File    Marker    Peak Height AMEL1 AMEL2 CSF1PO1 CSF1PO2
   <int> <chr>              <chr>    <dbl> <chr>  <chr> <chr> <chr>   <chr>  
 1    1 A02_1710963103.fsa AMEL    1 5137    X    NA    NA      NA     
 2    2 A02_1710963103.fsa AMEL    2 4898   NA    Y     NA      NA     
 3    3 A02_1710963103.fsa CSF1PO    1 805    NA    NA    11    NA     
 4    4 A02_1710963103.fsa CSF1PO    2 652    NA    NA    NA    12
使用R可以吗

我试过使用这个:

RW_spread <- RW_leftjoin %>%
  rowid_to_column() %>% 
  group_by(Sample_File, Marker) %>%
  mutate(ID = paste0(Marker, Peak)) %>%
  ungroup() %>%
  spread(ID, Allele)
RW\u价差%
rowid_到_列()%>%
分组依据(样本文件、标记)%>%
突变(ID=0(标记,峰值))%>%
解组()%>%
传播(ID,等位基因)
但数据如下所示:

           Sample_File   Marker Peak Allele Height
 1: A02_1710963103.fsa     AMEL    1      X   5137
 2: A02_1710963103.fsa     AMEL    2      Y   4898
 3: A02_1710963103.fsa   CSF1PO    1     11    805
 4: A02_1710963103.fsa   CSF1PO    2     12    652
Sample_File          AMEL1 AMEL2 Height1 Height2 CSF1PO1 CSF1PO1 Height1 Height2
 1: A02_1710963103.fsa    X    Y    5137    4898    11    12      805    652
rowid Sample_File    Marker    Peak Height AMEL1 AMEL2 CSF1PO1 CSF1PO2
   <int> <chr>              <chr>    <dbl> <chr>  <chr> <chr> <chr>   <chr>  
 1    1 A02_1710963103.fsa AMEL    1 5137    X    NA    NA      NA     
 2    2 A02_1710963103.fsa AMEL    2 4898   NA    Y     NA      NA     
 3    3 A02_1710963103.fsa CSF1PO    1 805    NA    NA    11    NA     
 4    4 A02_1710963103.fsa CSF1PO    2 652    NA    NA    NA    12
rowid样本\u文件标记峰值高度AMEL1 AMEL2 CSF1PO1 CSF1PO2
1 A02_1710963103.fsa AMEL 1 5137 X NA NA
2 A02_1710963103.fsa AMEL 2 4898不适用
3 3 A02_1710963103.fsa CSF1PO 1 805 NA 11 NA
4 4 A02_1710963103.fsa CSF1PO 2 652 NA 12

非常感谢您的建议。

一种
tidyr
方法是
等位基因
高度
变量收集到一个列中,并使用剩余列创建一个关键变量(不包括用作id的变量)使用
unite
然后
spread
ing键/值对

library(tidyr) 

RW_leftjoin %>%
  gather(key, value, Allele, Height) %>%
  unite(tmp, c("Marker", "Peak", "key")) %>%
  spread(tmp, value)

         Sample_File AMEL_1_Allele AMEL_1_Height AMEL_2_Allele AMEL_2_Height CSF1PO_1_Allele CSF1PO_1_Height CSF1PO_2_Allele CSF1PO_2_Height
1 A02_1710963103.fsa             X          5137             Y          4898              11             805              12             652

请注意,
tidyr
的当前开发版本(0.8.3.900)包含函数
pivot\u wide
,该函数在单个函数调用中将data.frame转换为所需的wide格式(另请参见以下位置的vignette):

library(tidyr)
枢轴宽度(df,名称来自=c(“标记”,“峰值”),值来自=c(“等位基因”,“高度”))
#>样本文件等位基因\u AMEL\u 1等位基因\u AMEL\u 2等位基因\u CSF1PO\u 1
#>1 A02_1710963103.fsa X Y 11
#>等位基因CSF1PO 2高度AMEL 1高度AMEL 2高度CSF1PO 1
#> 1              12          5137          4898             805
#>高度\u CSF1PO\u 2
#> 1             652
包装版本(“tidyr”)
#> [1] '0.8.3.9000'
数据


df因为我个人更喜欢
data.table
而不是
tidyverse
,所以我会这样做

dcast(df,Sample_File~Marker+Peak,value.var=c("Allele","Height"))

该命令的作用是按标记和峰值(
Sample\u File~Marker+Peak
)对样本进行分组,并用等位基因和高度(
value.var=c(“等位基因”,“高度”)
)的值填充表格!非常好,谢谢!我不知道
unite
函数-那太聪明了。再次感谢。