Создание нового столбца путем вставки всех столбцов, соответствующих части строки в R

У меня есть фрейм данных, который был прочитан из файла, который был разделен табуляцией, но имел внутри столбец, разделенный точкой с запятой. Этот столбец содержит большинство интересующих меня переменных, однако он не отсортирован, поскольку некоторые строки содержат больше информации, чем другие, а некоторые строки имеют повторяющиеся значения. Однако интересующие переменные содержат идентификатор в качестве pat своей строки, например. «ген Ино».

Для каждой строки я хотел бы идентифицировать и скопировать все значения, соответствующие данному идентификатору, как показано ниже:

Текущий фрейм данных:

Столбец А V9_01 V9_02 CDS 1 Индекс123 ген «пла» CDS 2 ген "да" CDS 3 ген "бла" Местоположение:456 CDS 4 ген «делать» ген "ра" CDS 5 Индекс127 Местоположение893

Желаемый фрейм данных:

Столбец А V9_01 V9_02 Имя_гена CDS 1 Индекс123 ген «пла» ген «пла» CDS 2 ген "да" ген "да" CDS 3 ген "бла" Местоположение:456 ген "бла" CDS 4 ген «делать» ген "ра" ген «до», ген «ра» CDS 5 Индекс127 Местоположение893 NA

Я создал текущий фрейм данных, используя следующий код для чтения в исходном файле:

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 для части фрейма данных?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
53
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Подход с основанием 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 можно replaced с 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))

Другие вопросы по теме