R 是否有一种方法可以将多行分散到多个列中?
我是一个初学者,所以道歉,如果这不是很流利。我想分散我的数据,以便一个示例文件的所有变量都在一行中。我的数据(RW_leftjoin)当前看起来像这样: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
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
函数-那太聪明了。再次感谢。