1

我正在使用 R 创建相关性,代码如下:

Values<-read.csv(inputFile, header = TRUE)
O<-Values$Abundance_O
S<-Values$Abundance_S
cor(O,S)
pear_cor<-round(cor(O,S),4)
outfile<-paste(inputFile, ".jpg", sep = "")
jpeg(filename = outfile, width = 15, height = 10, units = "in", pointsize = 10, quality = 75, bg = "white", res = 300, restoreConsole = TRUE)
rx<-range(0,20000000)
ry<-range(0,200000)
plot(rx,ry, ylab="S", xlab="O", main="O vs S", type="n")
points(O,S, col="black", pch=3, lwd=1)
mtext(sprintf("%s %.4f", "pearson: ", pear_cor), adj=1, padj=0, side = 1, line = 4)
dev.off()
pear_cor

我现在需要找到每组数据的下四分位数并排除下四分位数内的数据。然后,我想重写没有这些值的数据,并在相关分析中使用新的数据列(因为我想通过下四分位数对数据进行阈值处理)。如果有一种方法我可以编写它,以便通过应用来自 Java 的参数(就像我对输入文件名一样)轻松更改阈值,那就更好了!

太感谢了。

我现在已经暗示了下面的答案,这是有效的,但是我需要将数据对保持在一起以进行相关性。这是我的数据示例(来自 csv):

Abundance_O Abundance_S
3635900.752 1390.883073
463299.4622 1470.92626
359101.0482 989.1609251
284966.6421 3248.832403
415283.663  2492.231265
2076456.856 10175.48946
620286.6206 5074.268802
3709754.717 269.6856808
803321.0892 118.2935093
411553.0203 4772.499758
50626.83554 17.29893001
337428.8939 203.3536852
42046.61549 152.1321255
1372013.047 5436.783169
939106.3275 7080.770535
96618.01393 1967.834701
229045.6983 948.3087208
4419414.018 23735.19352

因此,如果一个值不符合我的四分位数阈值(0.25 四分位数),我需要排除行中的两个值。因此,如果 O 的四分位数为 45000,则将删除“42046.61549,152.1321255”行。这可能吗?如果我将两列都作为数据框读取,我可以分别搜索每一列吗?或者找到四分位数,然后将该值输入到代码中以删除相应的行?

再次感谢,并对问题的演变感到抱歉!

4

2 回答 2

6

请尝试提供一个可重现的示例,但如果您在 data.frame 中有数据,您可以使用该quantile函数作为逻辑测试对其进行子集化。例如,在以下数据中,我们只想从数据框中选择测量变量“Val”的值高于底部四分位数的行:

# set.seed so you can reproduce these values exactly on your system
set.seed(39856)
df <- data.frame( ID = 1:10 , Val = runif(10) )
df
   ID        Val
1   1 0.76487516
2   2 0.59755578
3   3 0.94584374
4   4 0.72179297
5   5 0.04513418
6   6 0.95772248
7   7 0.14566118
8   8 0.84898704
9   9 0.07246594
10 10 0.14136138

# Now to select only rows where the value of our measured variable 'Val' is above the bottom 25% quartile
df[ df$Val > quantile(df$Val , 0.25 ) , ]
  ID       Val
1  1 0.7648752
2  2 0.5975558
3  3 0.9458437
4  4 0.7217930
6  6 0.9577225
7  7 0.1456612
8  8 0.8489870

# And check the value of the bottom 25% quantile...
quantile(df$Val , 0.25 )
      25% 
0.1424363 
于 2013-04-23T13:23:05.357 回答
0

虽然这是一个老问题,但我在自己的研究中遇到了这个问题,我得出了一个可能有人感兴趣的解决方案。

我首先定义了一个函数,它将数值向量转换为其分位数组。参数 n 确定分位数长度(四分位数 n = 4,十分位数 n = 10)。

qgroup = function(numvec, n = 4){

  qtile = quantile(numvec, probs = seq(0, 1, 1/n))
  out = sapply(numvec, function(x) sum(x >= qtile[-(n+1)]))

  return(out)
}

函数示例:

v = rep(1:20)

> qgroup(v)
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4

现在考虑以下数据:

dt = data.table(
  A0 = runif(100),
  A1 = runif(100)
)

我们对数据应用qgroup()以获得两个四分位组列:

cols = colnames(dt)
qcols = c('Q0', 'Q1')

dt[, (qcols) := lapply(.SD, qgroup), .SDcols = cols]

head(dt)

>   A0           A1        Q0 Q1
1:  0.72121846   0.1908863  3  1
2:  0.70373594   0.4389152  3  2
3:  0.04604934   0.5301261  1  3
4:  0.10476643   0.1108709  1  1
5:  0.76907762   0.4913463  4  2
6:  0.38265848   0.9291649  2  4

最后,我们只包括两个四分位数组都高于第一个四分位数的行:

dt = dt[Q0 + Q1 > 2]
于 2019-09-26T12:37:33.590 回答