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 |
任何帮助表示赞赏。谢谢。
我们可以通过将数据转换为长格式,进行自连接,然后过滤来做到这一点:
\nlibrary(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\nRun Code Online (Sandbox Code Playgroud)\n