R语言 基于另一列的不同级别的列的唯一行

8ljdwjyq  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(130)

我有一个像这样的有30000行的框架:

gene     logFC    adj.p.val disease
1  SYT11 1.9678590 3.542121e-09      DN
2   PPT1 0.7349565 5.239188e-09      DN
3 PHLDA2 2.7419282 5.478323e-08      DN
4  TGFBI 1.6491225 5.478323e-08      DN
5  CRIP1 1.6476587 2.342271e-07      DN
6  TIGAR 1.2751720 2.342271e-07      DN

字符串
疾病等级栏为

levels(as.factor(pfilter_hdata$disease))
[1] "DN"       "FSGS"     "FSGS-MCD" "HN"       "IgAN"     "LN"       "MCD"      "MGN"      "RPGN"


我想做的是提取每种疾病与所有其他疾病的独特基因。例如,在DN的情况下,我想创建一个文件,其中包含DN中存在的所有基因,而不是所有其他疾病。我如何在R中做到这一点?

mnemlml8

mnemlml81#

您可以将数据透视得更宽,并过滤总和仅为1的行:

library(tidyverse)

dat <- tibble(gene = c("abc", "123", "u&me", "acc", "123", "zzz", "efd", "123", "abc"),
       disease = c(rep("DN", 3), rep("FSGS", 3), rep("LN", 3)))

dat %>%
  mutate(val = 1) %>%
  pivot_wider(names_from = disease, values_from = val, values_fill = 0) %>%
  filter(rowSums(.[,2:ncol(.)]) == 1) 
#> # A tibble: 4 x 4
#>   gene     DN  FSGS    LN
#>   <chr> <dbl> <dbl> <dbl>
#> 1 u&me      1     0     0
#> 2 acc       0     1     0
#> 3 zzz       0     1     0
#> 4 efd       0     0     1

字符串
另一种选择是总结独特基因的数量,如果超过1,则进行过滤:

library(tidyverse)

dat |>
  reframe(gene = unique(gene), .by = disease) |>
  mutate(n = n(), .by = gene) |>
  filter(n == 1)
#> # A tibble: 4 x 3
#>   disease gene      n
#>   <chr>   <chr> <int>
#> 1 DN      u&me      1
#> 2 FSGS    acc       1
#> 3 FSGS    zzz       1
#> 4 LN      efd       1


第二种方法可能更有效。

相关问题