Избегайте использования вложенного цикла в сравнении нескольких столбцов - PullRequest
0 голосов
/ 31 января 2019

У меня есть такой кадр данных:

df <- data.frame(Patient.ID = rep(paste("Pat", seq(1:3), sep = ""), 2),
             Gene = c(rep("Gene1", 3), rep("Gene2", 3)),
             Ref = c("A", "C", "G", "T", "A", "T"),
             Tum1 = c("A", "A", "T", "T", "A", "T"),
             Tum2 = c("A", "C", "G", "G", "C", "C"))

Что я хотел бы сделать, это определить изменение, которое происходит между Ref или столбцом Tum.Другими словами, если Tum1 отличается от Tum2, возьмите строку символов, которая отличается от столбца Ref, и сохраните ее в отдельном столбце в качестве изменения, чтобы приведенный выше кадр данных стал:

df <- data.frame(Patient.ID = rep(paste("Pat", seq(1:3), sep = ""), 2),
             Gene = c(rep("Gene1", 3), rep("Gene2", 3)),
             Ref = c("A", "C", "G", "T", "A", "T"),
             Tum1 = c("A", "A", "T", "T", "A", "T"),
             Tum2 = c("A", "C", "G", "G", "C", "C"),
             BaseChange = c("NoCh", "C.A", "G.T", "T.G", "A.C", "T.C"))

I'mЯ знаю, что я мог бы использовать вложенный оператор ifelse (), как показано ниже (но расширенный), чтобы решить эту проблему, но мой фактический фрейм данных имеет гораздо больше комбинаций, и я считаю, что для этого должен быть "более безопасный" метод.

df$BaseChange <- as.factor(ifelse(df$Ref == "C" & df$Tum1 == "A" | df$Ref== "C" & df$Tum2 == "A", "C.A",
                              ifelse((df$Ref == "G" & df$Tum1 == "T" | df$Ref == "G" & df$Tum2 == "T"), "G.T",...)))

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Кажется, что вам нужно вставить уникальные Tum с, то есть

apply(df[3:5], 1, function(i) paste0(unique(i), collapse = '.'))
#[1] "A"   "C.A" "G.T" "T.G" "A.C" "T.C" 

Для замены первого A,

v2 <- apply(df[3:5], 1, function(i) paste0(unique(i), collapse = '.'))
replace(v2, nchar(v2) == 1, 'NoChange')
#[1] "NoChange" "C.A"      "G.T"      "T.G"      "A.C"      "T.C"
0 голосов
/ 31 января 2019

Это не красиво, но работает:

df <- df %>%
  mutate(BaseChange2 = ifelse( (as.character(Ref)==as.character(Tum1) & as.character(Ref) == as.character(Tum2)), "NoCh",
                                         ifelse(as.character(Ref)==as.character(Tum1),paste(Ref,Tum2, sep="."),paste(Ref,Tum1, sep="."))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...