我希望完成两个基于彼此的列,但它们是部分填充的。
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
)已配对。但是,缺少某些数据值,其中一列已部分完成或为空。如何填写本例中部分完成的值?
(我知道我应该展示我是如何尝试这样做的,但是我很难过,无法找到任何东西)
答案 0 :(得分:14)
我认为这就是你想要的:
#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