创建一个表,记录R中不为零的行对的数量

Zai*_*NST 5 r dataframe tidyverse

如果标题令人困惑,我深表歉意,但以下是我想要完成的任务。假设我有一个虚拟表,如下所示:

df <- data.frame(
  patient = paste0("patient",seq(1:6)),
  gene_1 = c(10,5,0,0,1,0),
  gene_2 = c(0,26,4,5,6,1),
  gene_3 = c(1,3,5,12,44,1)
)
Run Code Online (Sandbox Code Playgroud)
病人 基因_1 基因_2 基因_3
病人1 10 0 1
病人2 5 26 3
病人3 0 4 5
病人4 0 5 12
病人5 1 6 44
病人6 0 1 1

我想要的是另一个表,仅当两个值都不为零时才记录对的总数。该表看起来像这样:

第 1 列 列2 对数
基因1 基因2 2
基因1 基因3 3
基因2 基因3 5

任何帮助表示赞赏。谢谢。

Gre*_*gor 5

我们可以通过将数据转换为长格式,进行自连接,然后过滤来做到这一点:

\n
library(tidyr)\nlibrary(dplyr)\n## Long format, keep only non-zeros\nlong_data = pivot_longer(df, -patient) %>%\n  filter(value != 0) %>%\n  select(-value)\n\n## Self join on patient,\n## Remove exact matches (can't pair with yourself)\n## And use < to remove doublecounts\nlong_data %>%\n  left_join(long_data, by = "patient") %>%\n  filter(name.x != name.y & name.x < name.y) %>%\n  count(name.x, name.y)\n# # A tibble: 3 \xc3\x97 3\n#   name.x name.y     n\n#   <chr>  <chr>  <int>\n# 1 gene_1 gene_2     2\n# 2 gene_1 gene_3     3\n# 3 gene_2 gene_3     5\n
Run Code Online (Sandbox Code Playgroud)\n