Сравнение символов (факторов) в нескольких столбцах - PullRequest
0 голосов
/ 28 октября 2019

У меня есть фрейм данных, который содержит белки с различными аннотациями локализации из нескольких баз данных. Я хотел бы сравнить эти записи для каждого белка (строки) и записать результат в новый столбец с исходной записью, если они согласны, и «разногласие», если запись отличается от столбцов.

Полагаю, ответесть простое решение, но я еще не нашел, любая помощь очень ценится! Если возможно, я был бы признателен за решение проблемы:)

Спасибо!

Себастьян

start_df <- data.frame(protein = c("A", "B", "C", "D"),
             location_1 = c("membrane", "membrane", "nucleus", "mito"),
             location_2 = c("membrane", "nucleus", "nucleus", "membrane"),
             location_3 = c("membrane", "membrane", "nucleus", "membrane"),
             location_4 = c("membrane", "membrane", "nucleus", "mito"))

expectation <- data.frame(protein = c("A", "B", "C", "D"),
             location_1 = c("membrane", "membrane", "nucleus", "mito"),
             location_2 = c("membrane", "nucleus", "nucleus", "membrane"),
             location_3 = c("membrane", "membrane", "nucleus", "membrane"),
             location_4 = c("membrane", "membrane", "nucleus", "mito"),
             location_all = c("membrane", "disagrement", "nucleus", "disagrement"))

1 Ответ

1 голос
/ 28 октября 2019

Вы можете попробовать это:

library(tidyverse)

start_df <- data.table::data.table(protein = c("A", "B", "C", "D"),
             location_1 = c("membrane", "membrane", "nucleus", "mito"),
             location_2 = c("membrane", "nucleus", "nucleus", "membrane"),
             location_3 = c("membrane", "membrane", "nucleus", "membrane"),
             location_4 = c("membrane", "membrane", "nucleus", "mito"))

df <- data.table::as.data.table(t(x = start_df)) # transpose the dataframe for comparison in the apply statement
colnames(df) <- as.character(df[1,])
df1 <- df[-1,] # take the colnames out for the comparison between the cellular compartments you want to compare
ls <- apply(X = df1,MARGIN = 2, FUN = unique) # take unique - so that you have only one element if they all "agree" and only one location is there
start_df$unique <- ls # add this to your initial dataframe
res <- start_df %>% mutate(location_all =if_else( condition = grepl(",",start_df$unique), true = "disagrement", false = location_1 )) # write a new column with your desired outcome

Вы можете столкнуться с проблемами, если строки немного отличаются, например: "мембрана" и "Мембрана" и т. Д.

надеюсь, это поможети наилучшие пожелания

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...