【发布时间】:2017-08-06 01:15:14
【问题描述】:
我有两个数据框,它们的排列使得 qseqid 和 sseqid 在每一行中都是相同的:
Data frame 1
qseqid evalue bitscore
1 ENSDARP00000000004.2 1e-162 469.0
2 ENSDARP00000000005.6 0e+00 856.0
3 ENSDARP00000000042.9 0e+00 1272.0
4 ENSDARP00000000069.7 3e-111 333.0
5 ENSDARP00000000070.5 2e-11 58.2
Data frame 2
sseqid evalue bitscore
1 ENSDARP00000000004.2 9e-160 462.0
2 ENSDARP00000000005.6 0e+00 821.0
3 ENSDARP00000000042.9 0e+00 1293.0
4 ENSDARP00000000069.7 4e-102 310.0
5 ENSDARP00000000070.5 1e-11 58.2
我想创建一个单一的数据帧,其中包含数据帧中具有最低 e 值的行(这样我可以保留位分数),如果两个数据帧中的 evalues 相同,请跳过那一排。我的结果如下所示:
1 ENSDARP00000000004.2 1e-162 469.0
2 ENSDARP00000000069.7 3e-111 333.0
5 ENSDARP00000000070.5 1e-11 58.2
最小示例代码:
qseqid <- c("ENSDARP00000000004.2",
"ENSDARP00000000005.6",
"ENSDARP00000000042.9",
"ENSDARP00000000069.7",
"ENSDARP00000000070.5")
evalue <- c(1e-162, 0e+00, 0e+00, 3e-111, 2e-11 )
bitscore <- c(469.0, 856.0, 1272.0, 333.0, 58.2)
df_1 <- data.frame(qseqid, evalue, bitscore)
sseqid <- c("ENSDARP00000000004.2",
"ENSDARP00000000005.6",
"ENSDARP00000000042.9",
"ENSDARP00000000069.7",
"ENSDARP00000000070.5")
evalue <- c(9e-160, 0e+00, 0e+00, 4e-102, 1e-11)
bitscore <- c(462.0, 821.0, 1293.0, 310.0, 58.2)
df_2 <- data.frame(sseqid, evalue, bitscore)
我的第一个想法是使用 ifelse(),但是这种方法失败了,因为我不是 确定如果数据帧之间的 evalues 相等,如何传递该行,并且我不确定如何从任一数据帧返回成功的行。
filtered_df <- ifelse(df_1$evalue == df_2$evalue,
next, ifelse(df_1$evalue < df_2s$evalue,
successful df_1 row here,
successful df_2 row here))
我的第二个想法是使用 rbind() 组合数据帧,然后使用 aggregate() 找到最小值,最后将结果合并成一个 单个数据框。然而,这并没有最终处理真实的数据集。它大约有 12k 行,我最终得到了太多重复值。一个优雅的解决方案将不胜感激。
【问题讨论】:
-
射击,我刚刚意识到如果我想跳过相等的行,我可以将 == 设置为 !=。仍然需要弄清楚如何返回一行。
标签: r