我有两个数据帧不同的列数 . 我想从df1中减去df2行的强度值,逐列(即样本) . 我的条件是:
-
在df1中,对于每个基因(gene_nm),肽序列(pep_seq)和它们对应的每个样品的强度(int_sam)有多行 . 同一基因多次出现,即占据几排 .
-
在df2中,基因(行)仅出现一次,具有相应的强度值
-
因此,df1比df2长得多(例如,55000行对6000行)
-
强度列数(int_samp)可以很多 . 我在这个例子中有3个
Dataframe 1
pep_seq = c("aaaaaaaaa", "ababababba", "dfsfsfsfds", "xbbcbcncncc", "fbbdsgffhhh", "dggdgdgegeggerr",
"dfgthrgfgf", "wegregegg", "egegegergewge", "sfngegebser", "qegqeefbew", "qegqetegqt",
"qwtqtewr", "etghsfrgf", "sfsdfbdfbergeagaegr", "wasfqertsdfaefwe")
int_samp_1 = c("2421432", "24242424", "NA", "4684757849", "NA", "10485040", "NA",
"6849400", "40300", "NA", "NA", "NA", "556456466", "4646456466", "246464266", "4564242646")
int_samp_2 = c("NA", "5342353", "14532556", "43566", "46367367", "768769769", "797899", "NA", "NA", "NA",
"686899", "7898979", "678568", "NA", "68886", "488")
int_samp_3 = c("11351", "NA", "NA", "NA", "1354151345", "1351351354", "314534", "1535", "3145354", "4353455",
"324535", "3543445", "34535", "34535534", "NA", "NA")
gene_nm = c("A", "A", "A", "A", "A", "A", "B", "B", "B", "C", "C", "C", "C", "C", "C", "C")
df_1 = cbind.data.frame(pep_seq, int_samp_1, int_samp_2, int_samp_3, gene_nm)
Dataframe 2
int_samp_1a = c("2421432", "24242424", "NA")
int_samp_2a = c("NA", "5342353", "14532556")
int_samp_3a = c("11351", "NA", "NA")
gene_nm.a = c("A", "B", "C")
df_2 = cbind.data.frame(gene_nm.a, int_samp_1a, int_samp_2a, int_samp_3a)
请建议 .
2 回答
在IIUC中,
df_1
和df_2
中有相同名称的列(例如int_samp_X
表示某个整数X
),并且您希望获得匹配列名称的差异,按gene_nm
分组(例如df_1[df_1$gene_nm == 'A', int_samp_1] - df_2[df_2$gene_nm == 'A', int_samp_1]
) .我们可以使用
tidyverse
系列包来解决这个问题,特别是dplyr
和purrr
.首先,将
df_1
和df_2
与left_join
合并,以确保_865874中的所有多个条目在与df_2
中的基因级条目匹配时保留:然后在感兴趣的列名称上
map
,从每个列对中获取差异 . (请注意,您需要先将int_samp
列从factor
转换为numeric
. )Update (根据OP评论):要在计算差异之前将
NA
转换为0
,我们可以使用mutate_if()
和replace()
,将以下内容添加到方法链中:最后,
join
回到df_1
:输出:
注意:这个答案主要来自akrun的答案here .
一个选项可以是使用
dplyr
连接df_1
和df_2
然后执行简单的矩阵减法 .Note: 数据框得到强度读数因子 . 当你期望进行减法时,我认为保持测量因素并不是一个好主意 . 因此我把它们转换成
integer
.