【问题标题】:filter one dataframe by contents of each column of the second one按第二个数据帧的每一列的内容过滤一个数据帧
【发布时间】:2022-09-30 21:23:55
【问题描述】:

我想通过另一个数据框的每个单独列的内容来过滤一个数据框,并从中生成一个数据框输出。 第一个数据框:

set.seed(1)
sites_df <- data.frame(QC1 = sample(c(LETTERS[1:6],NA,NA), size =10, replace = T)
                       ,QC2 = sample(c(LETTERS[2:7],NA,NA), size =10, replace = T)
                       ,QC3 = sample(c(LETTERS[1:8],NA), size =10, replace = T))

它看起来像这样:

> sites_df
    QC1  QC2  QC3
1     A    D <NA>
2     D    D    E
3  <NA>    B    E
4     A    F <NA>
5     B    F <NA>
6     E    C    E
7  <NA>    G    E
8     C    G    B
9     F    C <NA>
10    B <NA>    A

第二个数据框:

set.seed(1)
compartments <- data.frame(Protein = sample((LETTERS[1:8]), size =20, replace = T)
                           ,compartment = paste0(\"comp\", LETTERS[1:4])) %>% 
  unique()

它看起来像这样:

> compartments
   Protein compartment
1        A       compA
2        D       compB
3        G       compC
4        A       compD
5        B       compA
6        E       compB
8        C       compD
9        F       compA
10       B       compB
11       C       compC
15       E       compC
16       B       compD
18       F       compB
19       B       compC
20       G       compD

对于sites_df 的每一列,我想知道有多少独特的此列的元素存在于compartments$Protein 列中,然后将其汇总如下所示。我可以逐列进行:

# first, create a list of unique sites for a selected column
QC1_sites <- sites_df %>% 
  select(QC1) %>% 
  drop_na() %>% 
  unique %>%
  deframe()


# then, filter the compartments object and calculate summary statistics 
QC1_comp <- compartments %>% 
  filter(Protein %in% QC1_sites) %>% 
  group_by(compartment) %>% 
  count() %>% 
  rename(QC1_comp = n) %>%  #last two lines needed for joining later
  ungroup()

然后,我可以使用join() 函数之一并由compartment 加入,将每个单独的对象(QC1_compQC2_comp 等)合并到一个数据帧中。

期望的输出:

  compartment QC1_comp QC2_comp QC3_comp
1 compA              3        2        2
2 compB              4        3        2
3 compC              3        3        2
4 compD              3        3        2

对于较大的数据框,这变得不可能逐列进行。

如果有帮助,我还可以有一个字符向量列表,而不是我的原始数据框sites_df

    标签: r dataframe dplyr filter


    【解决方案1】:

    在基础 R 中,您可以这样做:

    sapply(sites_df, function(site) 
      table(factor(compartments$compartment)[compartments$Protein %in% site]))
    
    #       QC1 QC2 QC3
    # compA   3   2   2
    # compB   4   3   2
    # compC   3   3   2
    # compD   3   3   2
    

    我在那里使用了factor,这样table 就不会省略可能出现的零。

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多