2016-02-25 2 views
0

Я бы хотел проверить два набора данных. один данные имеет множество столбцов (в этом примере имеет два столбца df1) и один данные имеют один столбец (df2)поиск похожих строк в каждой строке из двух разных кадров данных

Во-первых, я хочу проверить первый столбец df1 каждую строку со всей частью df2, если любая подобная часть найдена, то число строк df1 и df2 написано

, например колонке 1 df1 имеет два аналогичных часть строки к df2 Q9Y6Q9 в строке 3 из df1 с Q9Y6Q9 в строке 4 o f df2. поэтому выход 3-4, то же самое для других

+0

Я думаю, грамматику отбрасывает меня, и, возможно, английский не является вашим родным языком, но я не совсем понимаю. Тем не менее, я думаю, что это связано с использованием цикла 'for' для циклического преобразования двух ваших фреймов данных, строки за строкой и оператора' if' внутри вашего цикла 'for', который проверяет, выполнено ли ваше условие и делает ли редактирование, если это так. – giraffehere

+0

Не уверен, что это вы на самом деле после того, как ваша спецификация не соответствует ожидаемому результату. Но вот строка кода, которая находит любые «подстроки» в столбце df1 $ sample_1 в соответствующих строках в df2. 'apply (df1, 1, function (x) grep (paste (unlist (strsplit (x [1], ';')), collapse = '|'), df2 $ subunits..UniProt.IDs.))' – Gopala

+0

@Gopala спасибо, но ниже правильный ответ. однако, я все еще жду некоторых изменений, если у вас есть какие-либо идеи, вы можете настроить его ответ – nik

ответ

1

Возможно, вам сначала нужно нормализовать данные. Например, вы могли бы сделать:

normalize <- function(x, delim) { 
    x <- gsub(")", "", x, fixed=TRUE) 
    x <- gsub("(", "", x, fixed=TRUE) 
    idx <- rep(seq_len(length(x)), times=nchar(gsub(sprintf("[^%s]",delim), "", as.character(x)))+1) 
    names <- unlist(strsplit(as.character(x), delim)) 
    return(setNames(idx, names)) 
} 

Эта функция может применяться к каждому столбцу df1, а также таблицы перекодировки df2:

s1 <- normalize(df1[,1], ";") 
s2 <- normalize(df1[,2], ";") 
lookup <- normalize(df2[,1], ",") 

С этой нормализованных данных, легко генерировать выходной вы ищете:

process <- function(s) { 
    lookup_try <- lookup[names(s)] 
    found <- which(!is.na(lookup_try)) 
    pos <- lookup_try[names(s)[found]] 
    return(paste(s[found], pos, sep="-")) 
    #change the last line to "return(as.character(pos))" to get only the result as in the comment 
} 

process(s1) 
# [1] "3-4" "4-1" "5-4" 
process(s2) 
# [1] "2-4" "3-15" "7-16" 

выход не точно так же, как и в вопросе, но это может быть из-за ошибки ручного поиска.

Для того, чтобы перебрать все столбцы df1, вы могли бы использовать lapply:

res <- lapply(colnames(df1), function(x) process(normalize(df1[,x], ";"))) 
names(res) <- colnames(df1) 

Теперь res список индексируется по именам столбцов df1:

res[["sample_1"]] 
# [1] "4" "1" "4" 
+0

Я не знаю, как поблагодарить вас. Мне уже понравился ваш ответ. У меня есть два запроса. могу ли я сделать 1- команду, которая генерирует s1-s число столбцов df1? поэтому мне не нужно делать их вручную. 2- дайте мне только число строк df2. например, процесс (s1) # [1] "4" "1" "4". – nik

+0

Отредактирован ответ для решения ваших проблем. –

Смежные вопросы