基于已建立的列之间的关系,完成部分填充的列

  • 本文关键字:成部 填充 之间 建立 关系
  • 更新时间 :
  • 英文 :


我希望完成两个基于彼此的列,但是它们是部分填充的。

 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=MrsMs,那么性别应该填写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

对于这个,我们知道两个字母(例如,iu)是成对的。但是缺少一些数据值,其中一列部分完成或为空。在这个例子中,我如何填充部分完成的值?

(我知道我应该展示我是如何做到这一点的,但我被难住了,找不到任何东西)

我想这就是你想要的:

#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

最新更新