【发布时间】: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_comp、QC2_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。