Поиск части строки в другой строке в фрейме данных - PullRequest
0 голосов
/ 11 октября 2018

У меня есть набор данных, который выглядит примерно так:

long_name x y short_name
Adhesion G protein-coupled receptor E2 (ADGRE2) 10 10 ADGRE2
Adhesion G-protein coupled receptor G2 (ADGRG2) 12 12 ADX2
ADM (ADM) 13 13 ADM
ADP-ribosyl cyclase/cyclic ADP-ribose hydrolase 1 (CD38) 14 14 ACH1

Я хочу создать дополнительный столбец, в котором будет указано, является ли значение short_name значением long_name для получения значения ИСТИНА / ЛОЖЬ (или присутствует / нет) в новом столбце.

Здесь я увидел несколько советов по использованию функции grepl для поиска фрагмента строки в другой строке.,Проблема, с которой я сталкиваюсь, заключается в том, чтобы попытаться выполнить итерацию по всему файлу.

У меня есть что-то вроде:

for (row in 1:length(nrows(combined_proteins))){

  long_name = proteins[1]
  short_name = proteins[4]

  if grepl(short_name, long_name) = TRUE{

   proteins$presence = "Present"

   else proteins$presence = "Not"
  }
}

Но это, очевидно, не работает, и я не совсем уверенбудь это даже самый умный способ сделать это.Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Есть пара проблем с вашим for циклом.Вы хотите выполнить итерацию с 1:nrow() или 1:length().length(nrow()) почти всегда будет возвращать 1. Ваши операторы if должны иметь круглые скобки, поэтому должно быть if(boolean){return values}else{other return value} Если имя вашего фрейма данных proteins, то должно работать следующее.

for (row in 1:nrow(proteins)){

  print(proteins$long_name[row])
  long_name = proteins$long_name[row]
  short_name = proteins$short_name[row]

  if (grepl(short_name, long_name)){
    proteins$presence[row] ="Present"
  } else { 
    proteins$presence[row] = "Not"
  }
}

Вы также можете сделать то же самое, используя tidyverse пакеты dplyr и purrr.purrr предоставляет функции для итерации по нескольким столбцам одновременно.

proteins %>%
  dplyr::mutate(short_in_long = purrr::map2_lgl(short_name, long_name, function(x, y){
    grepl(x, y)
  }))
0 голосов
/ 11 октября 2018

Простой способ решить эту проблему - использовать функцию ifelse и str_detect из пакета stringr.

proteins<-read.table(header = TRUE, stringsAsFactors = FALSE, text=
"long_name x y short_name
'Adhesion G protein-coupled receptor E2 (ADGRE2)' 10 10 ADGRE2
'Adhesion G-protein coupled receptor G2 (ADGRG2)' 12 12 ADX2
'ADM (ADM)' 13 13 ADM
'ADP-ribosyl cyclase/cyclic ADP-ribose hydrolase 1 (CD38)' 14 14 ACH1"
)

library(stringr)
proteins$presence<- ifelse( str_detect(proteins$long_name, proteins$short_name ) , "Present",  "Not")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...