基于逻辑运算符和相同匹配 ID 的粘贴列表

paste list based on a logical operator combined with identical matching IDs

我是 R 的新手,我会尽力解释我的问题。

我在一个数据框中工作,其中有 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

我想做的是编写一个代码,在其中我使用逻辑运算符 x > 0.8 粘贴一个列表,其中包含 df 中的所有基因,并且仅粘贴基因名(列名和行名)所在的基因与上面的示例相同,在这种情况下,只有 "GENE271" 会是 "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)

我将 'TRUE' 设为文本,否则如果您使用 TRUE(无引号),它会将其转换为“1.00”。

您的示例数据作为数据框

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

以下语句分两步提供所需结果(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.omit(df) 来摆脱那些 NA,但解决方案提供了准确的数据,无需 运行 复杂的代码。