У меня есть фрейм данных, который был прочитан из файла, который был разделен табуляцией, но имел внутри столбец, разделенный точкой с запятой. Этот столбец содержит большинство интересующих меня переменных, однако он не отсортирован, поскольку некоторые строки содержат больше информации, чем другие, а некоторые строки имеют повторяющиеся значения. Однако интересующие переменные содержат идентификатор в качестве pat своей строки, например. «ген Ино».
Для каждой строки я хотел бы идентифицировать и скопировать все значения, соответствующие данному идентификатору, как показано ниже:
Текущий фрейм данных:
Желаемый фрейм данных:
Я создал текущий фрейм данных, используя следующий код для чтения в исходном файле:
DP_GTF<-read.delim("E:/Genome_Files/GTF/DolosPig51524.gtf", sep = "\t", comment.char = "#", header = F) %>%
subset(V3= = "CDS") %>%
#select(c("V9"))%>%
cSplit("V9",";")
Я не уверен, как получить желаемый фрейм данных, но предположим, что мне нужно запустить grep для части фрейма данных?
Подход с основанием R с использованием grep
, поиск гена
transform(df, Gene_Name = apply(df[,-1], 1, \(x){
res <- toString(grep("gene", x, value=T))
replace(res, res == "", NA)}), check.names=F)
Column A V9_01 V9_02 Gene_Name
1 CDS 1 Index123 gene pla gene pla
2 CDS 2 gene dah gene dah
3 CDS 3 gene blah Location:456 gene blah
4 CDS 4 gene do gene rah gene do, gene rah
5 CDS 5 Index127 Location893 <NA>
С dplyr, используя c_across
с rowwise
library(dplyr)
df %>%
rowwise() %>%
mutate(Gene_Name = toString(grep("gene", c_across(V9_01:V9_02), value=T)),
Gene_Name = replace(Gene_Name, Gene_Name == "", NA)) %>%
ungroup()
# A tibble: 5 × 4
`Column A` V9_01 V9_02 Gene_Name
<chr> <chr> <chr> <chr>
1 CDS 1 "Index123" gene pla gene pla
2 CDS 2 "" gene dah gene dah
3 CDS 3 "gene blah" Location:456 gene blah
4 CDS 4 "gene do" gene rah gene do, gene rah
5 CDS 5 "Index127" Location893 NA
Мы можем использовать Filter
для «гена» в Map
, который эффективно использует соответствующие столбцы в качестве векторов. NULL
можно replace
d с NA
.
> d |>
+ transform(Map(\(x, y) Filter(list(x, y), f=\(x) lapply(x, grepl, pat='gene')),
+ V9_01, V9_02)) |>
+ transform(gene_name=replace(gene_name, lengths(gene_name) == 0L, NA))
Column.A V9_01 V9_02 gene_name
1 CDS 1 Index123 gene pla gene pla
2 CDS 2 gene dah gene dah
3 CDS 3 gene blah Location:456 gene blah
4 CDS 4 gene do gene rah gene do, gene rah
5 CDS 5 Index127 Location893 NA
apply
, напротив, рассчитан на объекты класса "matrix" "array"
.
Данные:
> dput(d)
structure(list(Column.A = c("CDS 1", "CDS 2", "CDS 3", "CDS 4",
"CDS 5"), V9_01 = c("Index123", "", "gene blah", "gene do", "Index127"
), V9_02 = c("gene pla", "gene dah", "Location:456", "gene rah",
"Location893")), class = "data.frame", row.names = c(NA, -5L))