Использование логики if с соответствием - PullRequest
1 голос
/ 29 сентября 2019

Я хочу создать новый столбец, содержащий номер, индексированный из другого столбца. Выбор столбца зависит от индексированного числа.

Я пытался использовать циклы if, но не могу понять, как этого добиться

testdata <- data.frame(sample=c("A01", "A02", "A03"),
                       mode=c(187, 189, 190),
                       control=c("A03",NA,NA),
                       mancontrol=c(NA, 191, 192))


expectedresults <- data.frame(sample=c("A01", "A02", "A03"),
                              mode=c(187, 189, 190),
                              control=c("A01",NA,NA),
                              mancontrol=c(NA, 191, 192),
                              ctrlmode=c(190, 191, 192))

Мне нужно создать новый столбецв конце, ctrlmode.

A) Если в столбце «mancontrol» есть значение для этой строки, я хочу, чтобы это значение было помещено в «ctrlmode».

B) Если 'mancontrol' равен NA, я хочу посмотреть контрольный образец в столбце 'control', затем посмотреть режим контрольного образца в столбце 'mode' и перевести этот режим вновый столбец ctrlmode.

Буду очень признателен за помощь! Спасибо!

1 Ответ

2 голосов
/ 29 сентября 2019

Мы можем использовать match с case_when. Логика заключается в том, что если в «mancontrol» есть элементы, не относящиеся к NA, вернуть «mancontrol» или же match «control» с «sample», чтобы получить индекс, и использовать его для подмножества «mode»

library(dplyr)
testdata %>%
   mutate(ctrlmode = case_when(!is.na(mancontrol) ~ mancontrol, 
           TRUE ~ mode[match(control, sample)]))

если у нас есть несколько типов, убедитесь, что выходные данные имеют только один тип, так как case_when проверяет тип

testdata %>%
   mutate(ctrlmode = case_when(!is.na(mancontrol) ~ as.numeric(mancontrol), 
           TRUE ~ mode[match(control, sample)]))

Или мы можем создать индекс и использоватьчто назначить

i1 <- is.na(testdata$mancontrol)
testdata$mancontrol[i1] <- with(testdata, mode[match(control, sample)][i1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...