Возможно, вам сначала нужно нормализовать данные. Например, вы могли бы сделать:
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"
Я думаю, грамматику отбрасывает меня, и, возможно, английский не является вашим родным языком, но я не совсем понимаю. Тем не менее, я думаю, что это связано с использованием цикла 'for' для циклического преобразования двух ваших фреймов данных, строки за строкой и оператора' if' внутри вашего цикла 'for', который проверяет, выполнено ли ваше условие и делает ли редактирование, если это так. – giraffehere
Не уверен, что это вы на самом деле после того, как ваша спецификация не соответствует ожидаемому результату. Но вот строка кода, которая находит любые «подстроки» в столбце df1 $ sample_1 в соответствующих строках в df2. 'apply (df1, 1, function (x) grep (paste (unlist (strsplit (x [1], ';')), collapse = '|'), df2 $ subunits..UniProt.IDs.))' – Gopala
@Gopala спасибо, но ниже правильный ответ. однако, я все еще жду некоторых изменений, если у вас есть какие-либо идеи, вы можете настроить его ответ – nik