2016-08-17 69 views
0

我.csv格式的数据是这样的:对包含在两列(x,y)中的所有数据对执行Spearman相关?

sampleid blue   red    otuid 
AB1  0.001020366  0.000262013  K00001 
AB1  7.24E-05   0.00000307  K00002 
AB1  0.000500854  0.000635104  K00003 
AB1  3.50E-05   0.000000555  K00004 
AB1  0.000196537  0.0000346  K00005 
AB1  2.56E-05   2.92E-08   K00006 
AB1  0.00027525  0.0000392  K00007 
AB1  0.000177602  0.000000994  K00008 
AB1  0.000128098  0.000151901  K00009 
AB1  1.46E-06   0.000000468  K00010 
AB1  0.000348187  0.000571836  K00011 
AB1  0.000448518  0.000435364  K00012 
AB1  0.000490293  0.000729903  K00013 
AB1  0.000263668  0.00000567  K00014 
AB1  0.00054961  0.000406697  K00015 
AB2  0.001020366  0.000262013  K00001 
AB2  7.24E-05   0.00000307  K00002 
AB2  0.000500854  0.000635104  K00003 
AB2  3.50E-05   0.000000555  K00004 
AB2  0.000196537  0.0000346  K00005 
AB2  2.56E-05   2.92E-08   K00006 
AB2  0.00027525  0.0000392  K00007 
AB2  0.000177602  0.000000994  K00008 
AB2  0.000128098  0.000151901  K00009 
AB2  1.46E-06   0.000000468  K00010 
AB2  0.000348187  0.000571836  K00011 
AB2  0.000448518  0.000435364  K00012 
AB2  0.000490293  0.000729903  K00013 
AB2  0.000263668  0.00000567  K00014 
AB2  0.00054961  0.000406697  K00015 

当我运行COR()这样:

d <- read.csv("name.csv") 
cor(rank(test[,3]),rank(test[,4]) 
[1] 0.777888 

我假定这是所有的相关测试,但我平均R如果我能得到每个样品/ OTU每个测试单独的R(X与Y)宁愿这样的,我可以写一个表,看起来像这样:

otuid sampleid Spearman's R 
k00001 Sample1 0.001 
k00002 Sample1 0.012 
k00003 Sample1 0.013 
k00004 Sample1 0.015 ...... 

k00001 Sample2 0.001 
k00002 Sample2 0.012 
k00003 Sample2 0.013 
k00004 Sample2 0.015 

感谢您的帮助!

Data.frame沿着加速这一:

sampleid = c("AB1","AB1","AB1","AB1","AB1","AB1","AB1","AB1","AB1", 
"AB1","AB1","AB1","AB1","AB1","AB2","AB2","AB2","AB2","AB2","AB2","AB2", 
"AB2","AB2","AB2","AB2","AB2","AB2","AB2","AB2","AB2") 
red = c(runif(30,0,100)) 
blue = c(runif(30,0,100)) 
otuid =c("K00001","K00002","K00003","K00004","K00005","K00006", 
"K00007","K00008","K00009","K00010","K00011","K00012", 
"K00013","K00014","K00015","K00001","K00002","K00003","K00004", 
"K00005","K00006","K00007","K00008","K00009","K00010", 
"K00011","K00012","K00013","K00014","K00015") 
df = data.frame(sampleid, red, blue,otuid) 
df 
print(p) 
+1

按“样本/ OTUID”分组时,您的当前数据每组有1行。你能澄清更好的想法吗?例如,'OTUID = 00001'和'SampleID ='Sample1''只有一行。 – steveb

+1

它有助于提供样本数据作为可复制的数据框 –

+0

您的代码也是错误的:cor(rank(test [,3]),rank(test [,4])缺少右括号。该点,它不清楚你在找什么,两点不作相关(两个点在一排,这是一个观察...) –

回答

1

基于您的评论和使用所提供的数据帧,可以将每个样品内计算相关与purrr包如下:

library(purrr) 

df %>% 
    split(.$sampleid) %>% 
    map_dbl(~ cor(.$blue, .$red)) 
#>  AB1  AB2 
#> 0.07714403 0.38077482 

这里有一个基础R的方式来得到类似的东西:

by(df, df$sampleid, function(x) cor(x$blue, x$red)) 
#> df$sampleid: AB1 
#> [1] 0.205726 
#> -------------------------------------------------------- 
#> df$sampleid: AB2 
#> [1] 0.3237938 
+0

感谢看起来比我昨天写的脚本更简单,但他们都做这项工作! – user3105519

相关问题