2017-08-11 9 views
1

私はRを初めて使用しています。できるだけ良く問題を説明しようとします。同一の一致IDと結合された論理演算子に基づくペーストリスト

私は15571個のobsと18976個の変数を持つデータフレームで作業しています。 colnamesとrownamesは遺伝子名であり、その大部分は同じ名前一致を持っています。エントリーは数値のみで構成され、相関値です。これはそれがどのように見えるかです。

 [GENE128] [GENE271] [GENE2983] 
[GENE231] 0.71  0.98  0.32 
[GENE128] 0.23  0.61  0.90 
[GENE271] 0.87  0.95  0.63 

私は何をしようとしていますが、私は論理演算子とDFのすべての遺伝子にリストを貼り付けコード、X> 0.8を記述することで、遺伝子だけどこcol- genenames(とrownames)は同一ですので、上記の例では、この場合「GENE271」のみが「TRUE」になります。

これを行う方法はありますか?

答えて

1

あなたの例のデータ

vec = c(0.71,0.98,0.32,0.23,0.61,0.90,0.87,0.95,0.63) 
mt = matrix(vec, 3, 3, byrow = T) 
coln = c('GENE128', 'GENE271', 'GENE2983') 
rown = c('GENE231', 'GENE128', 'GENE271') 

df = data.frame(mt) 
colnames(df) = coln 
rownames(df) = rown 

ndf = data.frame(coln = as.vector(sapply(coln, function(x) rep(x, ncol(df)))), rown = rep(rown, ncol(df)), data = as.vector(as.matrix(df)), stringsAsFactors = F) 

idx_true = sapply(1:nrow(ndf), function(x) ndf[x, 1] == ndf[x, 2]) 

subs_ndf = ndf[idx_true, ] 

subs_ndf[which(ndf[idx_true, 'data'] > 0.8), ] 

出力

 coln rown data 
6 GENE271 GENE271 0.95 
0

誰かがより良い、より速い方法を持っていると確信しています。あなたはTRUE(引用符なし)を使用する場合、それ以外の場合は「1.00」に変換しますので、私はテキストとして'TRUE'を作っ

test <- data.frame(GENE128 = c(0.71,0.23,0.87), GENE271 = c(0.98,0.61,0.95), 
        GENE2983 = c(0.32,0.90,0.63)) 
row.names(test) <- c('GENE231', 'GENE128', 'GENE271') 

gene.equal <- function(x, limit = 0.8){ 
    df <- c() 
    for(i in 1:nrow(x)){ 
    row <- x[i,] 
    indexes <- which(row.names(row) == colnames(x)) 
    if(length(indexes) > 0 && row[,indexes] > limit){ 
     row[,indexes] <- 'TRUE' 
    } 
    df <- rbind(df, row) 
    } 
    df 
} 


new.df <- gene.equal(x = test) 

....この方法は遅くなりますが、それは動作するはずです。データフレームとして

+0

私はこれを「TRUE」の値に置き換えることを前提に書いています。もう1つの答えは、マッチで出力したかったらいいです。 – Balter

0

は、次の値を新しいデータフレームを構築し、ベクトル化するために、行の名前とCOLNAMESを使用ステートメントは、2つのステップで所望の結果を提供します(dfはデータフレームです)。

> df <- df[which(row.names(df) %in% colnames(df) & df >= 0.8),] 
> df 
     GENE128 GENE271 GENE2983 
GENE271 0.87 0.95  0.63 
NA   NA  NA  NA 
NA.1   NA  NA  NA 
> na.omit(df) 
     GENE128 GENE271 GENE2983 
GENE271 0.87 0.95  0.63 

私はそれらのNAを取り除くためにna.omit(df)を使用する必要がありますが、解決策は、複雑なコードを実行せずに正確なデータを提供します。