【问题标题】:Using R to remove data which is below a quartile threshold使用 R 删除低于四分位数阈值的数据
【发布时间】:2013-04-16 17:16:51
【问题描述】:

我正在使用 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”行。这可能吗?如果我将两列都作为数据框读取,我可以分别搜索每一列吗?或者找到四分位数,然后将该值输入到代码中以删除相应的行?

再次感谢,对于问题的演变,我们深表歉意!

【问题讨论】:

标签: r correlation


【解决方案1】:

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

我首先定义了一个函数,它将数值向量转换为其分位数组。参数 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]

【讨论】:

    【解决方案2】:

    请尝试提供一个可重现的示例,但如果您在 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 
    

    【讨论】:

    • 嗨,谢谢 :) 这是编译,但是相关图在 0 处仅给出一个点。尝试找出为什么我使用 print 在控制台中显示数据框。这将返回“TRUE”和“FALSE”的数据帧,而不是数字的数据帧。有没有一种方法可以将结果返回为可用于相关性分析的新数字表?
    • 您确定您没有输入df$Val &gt; quantile(df$Val , 0.25 ) 而不是df[ df$Val &gt; quantile(df$Val , 0.25 ) , ]?如果您需要进一步的帮助,您需要将dput( head( Values , n = 20 ) ) 的输出粘贴到您的问题中,以便我们查看您正在处理的数据。
    • 我正在使用 > Synapt[SynaptAll > quantile(SynaptAll,thresh)] 如果我使用 > Synapt[SynaptAll > quantile(SynaptAll,thresh),] 我得到一个错误: Synapt[SynaptAll > 中的错误quantile(SynaptAll, thresh), ] : 不正确的维数 这是 dput(head(Values,n=20) 的输出:
    • 不,如果您想将其分配给您需要使用的新对象:Synapt &lt;- SynaptAll[SynaptAll &gt; quantile(SynaptAll,thresh)]。您正在将[] 之外的对象设置为[] 内部的对象。所以它必须在子集运算符内部和外部都是SynaptAll,因为Synapt 还不存在。只需将返回的结果分配给不同的变量名。这行得通吗?!
    • > DPOT(头部(值,n = 20))结构(列表(ABUNDANCE_O = C(734956.5302,323545.2051,323545.2051,311964.3823,1940461.56,147217.2137,1262117217.2137,12117217.2137,12117217.2137,1262718.587,792266,1514,356067.042,418253.4821, 18526.71302、29326.81769、2667140.584、700782.2009、1079481.26、165589.0245、664627.8291、945695.3959、158066.0325),
    猜你喜欢
    • 1970-01-01
    • 2020-03-16
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    相关资源
    最近更新 更多