我有一个 R 数据框,包含三列:Gene.ID、来源和值。我需要根据多个条件过滤行,但我无法获得所需的结果。这是我的数据示例: 我的目标是:
保留具有相同 Gene.ID 和来源的行。 对于具有相同 Gene.ID 但来源不同的行,我只想在值与前一行不同时保留它们。 我尝试了使用 dplyr 和自定义循环的各种方法,但我无法实现所需的过滤逻辑。
有人可以提供解决方案或建议一种有效的方法来根据这些条件过滤此数据框吗?
感谢您的协助!
df <- data.frame(
Gene.ID = c(
"NZ_JAHWGH010000001.1_15",
"NZ_JAHWGH010000001.1_17",
"NZ_JAHWGH010000001.1_68",
"NZ_JAHWGH010000001.1_7"
),
HMMER = c(
"SLH",
"GT2",
"GT2",
"GH13+CBM41+CBM41+GH13"
),
dbCAN_sub = c(
"",
"GT2",
"GT2",
"CBM41+GH13+CBM41+CBM41+CBM48+GH13"
),
DIAMOND = c(
"",
"",
"GT2",
"CBM41+CBM48+GH13+GH13+GH11"
),
stringsAsFactors = FALSE
)
我想要的输出如下
df_output <- data.frame(
Gene.ID = c(
"NZ_JAHWGH010000001.1_15",
"NZ_JAHWGH010000001.1_17",
"NZ_JAHWGH010000001.1_68",
"NZ_JAHWGH010000001.1_7",
"NZ_JAHWGH010000001.1_7",
"NZ_JAHWGH010000001.1_7",
"NZ_JAHWGH010000001.1_7",
"NZ_JAHWGH010000001.1_7",
"NZ_JAHWGH010000001.1_7",
"NZ_JAHWGH010000001.1_7"
),
combined = c(
"SLH",
"GT2",
"GT2",
"CBM41",
"GH13",
"CBM41",
"CBM41",
"CBM48"
"GH13",
"GH11"
),
stringsAsFactors = FALSE
)
我尝试使用此命令,但没有得到所需的输出
df_output <- df %>%
separate_rows(., sep = "\\+") %>%
gather(key = "source", value = " ", -Gene.ID) %>%
filter(combined != "") %>%
distinct(Gene.ID, combined)
遵循您的方法的工作版本用更新的版本替换了一些
tidyr
功能:
library(dplyr)
library(tidyr)
df %>%
tidyr::separate_longer_delim(HMMER, delim = "+") %>%
tidyr::separate_longer_delim(dbCAN_sub, delim = "+") %>%
tidyr::separate_longer_delim(DIAMOND, delim = "+")%>%
tidyr::pivot_longer(-Gene.ID, values_to = "combined") %>%
dplyr::select(Gene.ID, combined) %>%
dplyr::filter(combined != "") %>%
dplyr::distinct()
# A tibble: 7 x 2
Gene.ID combined
<chr> <chr>
1 NZ_JAHWGH010000001.1_15 SLH
2 NZ_JAHWGH010000001.1_17 GT2
3 NZ_JAHWGH010000001.1_68 GT2
4 NZ_JAHWGH010000001.1_7 GH13
5 NZ_JAHWGH010000001.1_7 CBM41
6 NZ_JAHWGH010000001.1_7 CBM48
7 NZ_JAHWGH010000001.1_7 GH11
请注意,如果使用较大的初始数据帧运行,这可能会创建非常长的中间数据帧,因为
separate_longer
步骤会创建许多包含冗余内容的行,这些行只会在最后再次删除(在本例中为 4 -> 359 -> 7 行)。对于大型数据集,可能有一种更有效的方法来做到这一点。