【问题标题】:How to use R to get all pairs from two column with index如何使用 R 从具有索引的两列中获取所有对
【发布时间】:2016-10-02 03:52:43
【问题描述】:

我想使用 R 从两列索引中获取所有对。它可能需要一些循环来完成这个功能。例如,将基因名称和索引转两列:

 a 1,
 b 1,
 c 1,
 d 2,
 e 2

进入一个新的矩阵

 a b 1, 
 b c 1,
 a c 1,
 d e 2

谁能帮忙?

【问题讨论】:

  • 有很多函数可以用于关联,例如cor()MINE()。但是,它是不同的。

标签: r combinations


【解决方案1】:

tidyverse 选项在分组的 data.frame 上使用 combn

library(tidyverse)

df %>% group_by(index) %>% 
        summarise(gene = list(as_data_frame(t(combn(gene, 2))))) %>% 
        unnest(.sep = '_')

## # A tibble: 4 × 3
##   index gene_V1 gene_V2
##   <int>   <chr>   <chr>
## 1     1       a       b
## 2     1       a       c
## 3     1       b       c
## 4     2       d       e

同样的逻辑可以在基础 R 中复制:

df2 <- aggregate(gene ~ index, df, function(x){t(combn(x, 2))})

do.call(rbind, apply(df2, 1, data.frame))

##   index gene.1 gene.2
## 1     1      a      b
## 2     1      a      c
## 3     1      b      c
## 4     2      d      e

数据

df <- structure(list(gene = c("a", "b", "c", "d", "e"), index = c(1L, 
    1L, 1L, 2L, 2L)), .Names = c("gene", "index"), row.names = c(NA, 
    -5L), class = "data.frame")

【讨论】:

  • 谢谢! @alistaire
【解决方案2】:

这是一个使用data.table 的选项。将'data.frame'转换为'data.table'(setDT(df)),按'index'分组,我们得到'gene'的combntranspose它并设置第2列和第3列的名称(如果需要)。

library(data.table)
setnames(setDT(df)[, transpose(combn(gene, 2, FUN = list)), 
             by = index], 2:3, paste0("gene", 1:2))[]
#   index gene1 gene2
#1:     1     a     b
#2:     1     a     c
#3:     1     b     c
#4:     2     d     e

【讨论】:

  • 非常感谢! @akrun
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 2012-10-14
  • 2018-03-13
相关资源
最近更新 更多