我有一个输出数据,每行中每个基因都有多个同种型。异构体用逗号分隔,'。当我将表导入R时,数据框如下所示。
Df:
gene isoform sample1_read_number p-value
A 'A1','A2','A3' 0:23,1:12,2:122 0.9,0.01,0.5
B 'B1','B2','B3' 0:3,1:45,2:76 0.43,0.001,0.12
C 'C1','C2','C3','C4' 0:5,1:56,2:166,3:7 0.004,0.002,0.23,0.12
D 'D1','D2' 0:43,1:100 0.1,0.0003
对于每个基因,有多种同种型。对于每个同种型,我有读数,用逗号分隔(0:23读取A1意味着A1读数是23)和p值用逗号分隔(A1的p值是0.9,A2是0.01)。因此,每个对象中的所有内容都按逗号分隔顺序排列。
例如,当我致电df[1,2]
时,结果为[1] 'A1','A2','A3''
或df[1,4]
结果为[1] 0.9,0.01,0.5
作为一个对象。我无法想象如何让R在df [X,Y]中分隔这些值。
我想这样做的原因是,我想根据p值或读取数量过滤此数据。为了能够做到这一点,首先我应该能够通过每个同种型来打破这个数据框,为此我需要找到一种方法来分离每个点上的值。
最终数据框应该是这样的(这里仅显示基因A和B):
Df_I:
gene isoform sample1_read_number p-value
A A1 0:23 0.9
A A2 1:12 0.01
A A3 2:122 0.5
B B1 0:3 0.43
B B2 1:45 0.001
B B3 2:76 0.12
任何人都可以给我创建第二个数据框架的想法吗? 任何帮助都会受到很多赞赏!
干杯! 甲
答案 0 :(得分:3)
separate_rows
函数的tidyr
函数是根据您的情况编写的:
tidyr::separate_rows(df, isoform:p.value, sep = ",")
# gene isoform sample1_read_number p.value
#1 A A1 0:23 0.9
#2 A A2 1:12 0.01
#3 A A3 2:122 0.5
#4 B B1 0:3 0.43
#5 B B2 1:45 0.001
#6 B B3 2:76 0.12
#7 C C1 0:5 0.004
#8 C C2 1:56 0.002
#9 C C3 2:166 0.23
#10 C C4 3:7 0.12
#11 D D1 0:43 0.1
#12 D D2 1:100 0.0003
答案 1 :(得分:1)
可以使用cSplit
splitstackshape
轻松完成此操作
library(splitstackshape)
na.omit(cSplit(Df, 2:ncol(Df), ",", "long"))
# gene isoform sample1_read_number p.value
# 1: A A1 0:23 0.9000
# 2: A A2 1:12 0.0100
# 3: A A3 2:122 0.5000
# 4: B B1 0:3 0.4300
# 5: B B2 1:45 0.0010
# 6: B B3 2:76 0.1200
# 7: C C1 0:5 0.0040
# 8: C C2 1:56 0.0020
# 9: C C3 2:166 0.2300
#10: C C4 3:7 0.1200
#11: D D1 0:43 0.1000
#12: D D2 1:100 0.0003