我有一個非常大的基因組位點資料框,其基因型評分為 0、1 或 2。這是我認為解決問題的一個非常小的樣本:
x1 x2 x3 x4
0 0 1 0
0 0 1 0
1 1 2 1
1 1 1 1
2 2 0 1
2 2 1 2
基因座 x1 和 x2 相同,而 x4 高度相似。我希望實作的是創建一個函式,或者使用一個已經存在的函式,為我的每個基因座按行分配相似度分數,然后根據我設定的閾值相似度修剪資料集。
例如,如果我將閾值設定為 1 (100%),它只會修剪 x1 和 x2,因為它們是重復的——我知道該怎么做。但是,如果我將閾值設定為 0.8 或 80% 的相似性,除了 x1 和 x2 之外,它還會修剪 x4。
重要的是,該函式作用于逐行相似性,而不僅僅是比較列具有相似的 0、1 和 2 分布。
uj5u.com熱心網友回復:
這是我將如何處理這個問題。
首先,獲取列名的所有唯一配對的串列:
pairs <- expand.grid(names(df), names(df))
pairs <- pairs[lower.tri(replicate(length(df), names(df))),]
pairs
#> Var1 Var2
#> 2 x2 x1
#> 3 x3 x1
#> 4 x4 x1
#> 7 x3 x2
#> 8 x4 x2
#> 12 x4 x3
現在遍歷此以比較原始資料集的每對唯一列中相同的行的比例。這為您提供了每列對的 0 到 1 之間的相似性分數:
pairs$similarity <- apply(pairs, 1, function(x) sum(df[x[1]] == df[x[2]])/nrow(df))
pairs
#> Var1 Var2 similarity
#> 2 x2 x1 1.0000000
#> 3 x3 x1 0.1666667
#> 4 x4 x1 0.8333333
#> 7 x3 x2 0.1666667
#> 8 x4 x2 0.8333333
#> 12 x4 x3 0.1666667
現在洗掉此串列中所有相似度分數低于您選擇的閾值的行(我們將在此處設為 0.8)
pairs <- pairs[which(pairs$similarity > 0.8),]
pairs
#> Var1 Var2 similarity
#> 2 x2 x1 1.0000000
#> 4 x4 x1 0.8333333
#> 8 x4 x2 0.8333333
現在我們提取 和 中的所有唯一列名Var1,Var2因為這些列至少與另一列相似:
keep_cols <- as.character(sort(unique(c(pairs$Var1, pairs$Var2))))
#> [1] "x1" "x2" "x4"
我們使用它對原始資料框進行子集化以獲得我們想要的結果:
df[match(keep_cols, names(df))]
#> x1 x2 x4
#> 1 0 0 0
#> 2 0 0 0
#> 3 1 1 1
#> 4 1 1 1
#> 5 2 2 1
#> 6 2 2 2
當然,您可以將所有這些放在一個函式中,以便更輕松地調整閾值并迭代應用:
remove_dissimilar <- function(df, threshold = 0.8) {
pairs <- expand.grid(names(df), names(df))
pairs <- pairs[lower.tri(replicate(length(df), names(df))),]
pairs$similarity <- apply(pairs, 1, function(x) {
sum(df[x[1]] == df[x[2]])/nrow(df)})
pairs <- pairs[which(pairs$similarity > threshold),]
keep_cols <- as.character(sort(unique(c(pairs$Var1, pairs$Var2))))
df[match(keep_cols, names(df))]
}
所以現在你可以這樣做:
remove_dissimilar(df, 0.8)
#> x1 x2 x4
#> 1 0 0 0
#> 2 0 0 0
#> 3 1 1 1
#> 4 1 1 1
#> 5 2 2 1
#> 6 2 2 2
remove_dissimilar(df, 0.9)
#> x1 x2
#> 1 0 0
#> 2 0 0
#> 3 1 1
#> 4 1 1
#> 5 2 2
#> 6 2 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467225.html
上一篇:pandasdataframegroupby按多列條件獲取計數
下一篇:RDataframe重組和總結
