Завершить частично заполненные столбцы на основе установленных связей между столбцами

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

 title <- c("Mrs", "Ms", "", "Ms", "Mr", "Mr", "")
 gender <- c("female", "", "male", "female", "", "Male", "female")

 df <- as.data.frame(cbind(title, gender))

 df 

    title gender
 1   Mrs female
 2    Ms       
 3         male
 4    Ms female
 5    Mr       
 6    Mr   Male

В этом примере мы знаем, что если title=Mrs или Ms, то пол должен быть заполнен с помощью female, а если title=Mr, то пол должен быть заполнен как male. С другой стороны, если только пол заполнен, чтобы быть female, тогда заголовок должен быть Ms, или для male заголовок должен быть Mr.

Чтобы добавить к этому, как вы сможете заполнить частично заполненную таблицу, не устанавливая отношения заранее. См. Пример ниже:

c1 <- paste(rep(letters[1:12], 4))
c2 <- paste(rep(letters[13:24], 4))
df <- as.data.frame(cbind(c1, c2), stringsAsFactors=FALSE)

#replacing 8 strings in each column
df[sample(nrow(df), 8),]$c1 <- ""
df[sample(nrow(df), 8),]$c2 <- ""
df

Для этого мы знаем, что две буквы (например, i и u) сопряжены. Однако некоторые из значений данных отсутствуют, когда один столбец частично завершен или пуст. Как заполнить значения, которые частично завершены в этом примере?

(Я знаю, что должен показать, как я пытался это сделать, но я в тупике и ничего не нашел)

Ответ 1

Я думаю, что это то, что вы хотите:

#Find those where there is no title
noTitle = which(df$title=="")
#And fill them in based on the gender
df$title[noTitle] = ifelse(grepl("[Ff]",df$gender[noTitle]), "Ms", "Mr")
#Do the same for gender
noGender = which(df$gender=="")
df$gender[noGender] = ifelse(grepl("[Ss]",df$title[noGender]), "female", "male")

Если бы они были пустыми, тогда была бы проверка для начала и конвертировать их по мере необходимости; что-то вроде:

#Find where both empty
Neither = intersect( which(df$title=""), which(df$gender=="") )
##Do something here