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()を適用して、2 つの四分位グループ列を取得します。

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 に答える