简体   繁体   English

R:具有多个并行结果的分层ifelse条件

[英]R: hierarchical ifelse condition with multiple, parallel outcomes

I am looking for an elegant solution to the following problem: 我正在寻找以下问题的理想解决方案:

I need to allocate owners to firms based on different matching criteria. 我需要根据不同的匹配标准将所有者分配给公司。 These matching criteria are of different quality, hence criteria with weaker quality should only be used if higher quality criteria do not yield results. 这些匹配标准的质量不同,因此,仅当较高质量的标准无法产生结果时,才应使用质量较弱的标准。 In my example, all a criteria are of the same quality level and of higher quality than b criteria. 在我的例子,所有的a标准是相同的质量水平和更高质量的b标准。

The following to illustrate my point: 下面来说明我的观点:

firmname <- c("Firm A", "Firm B", "Firm C", "Firm D", "Firm E", "Firm F")
ownermatch_a1 <- c("Owner 1", NA, NA, NA, "Owner 5", "Owner 6")
ownermatch_a2 <- c("Owner 1", NA, NA, "Owner 4", "Owner 5", "Owner 6")
ownermatch_a3 <- c("Owner 1", NA, "Owner 3", "Owner 4", "Owner 5", "Owner 6")
ownermatch_b1 <- c("Owner 1", "Owner 2", "Owner 3", "Owner 4", "Owner 5", "Owner 6")
ownerfinal <- (NA)

data.frame(firmname, ownermatch_a1, ownermatch_a2, ownermatch_a3, ownermatch_b1, ownerfinal)

This yields the following table 产生下表

 firmname ownermatch_a1 ownermatch_a2 ownermatch_a3 ownermatch_b1 ownerfinal
1   Firm A       Owner 1       Owner 1       Owner 1       Owner 1       <NA>
2   Firm B          <NA>          <NA>          <NA>       Owner 2       <NA>
3   Firm C          <NA>          <NA>       Owner 3       Owner 3       <NA>
4   Firm D          <NA>       Owner 4       Owner 4       Owner 4       <NA>
5   Firm E       Owner 5       Owner 5       Owner 5       Owner 5       <NA>
6   Firm F       Owner 6       Owner 6       Owner 6       Owner 6       <NA>

I now want R to do the following: 1) If any Firm one of the 3 a criteria is non-NA, put it as ownerfinal . 我现在希望R执行以下操作:1)如果3 a条件之一中的任何Firm是非NA,则将其作为ownerfinal 2) If there are multiple parallel a non-NA, take any of these randomly and put as ownerfinal 3) Only if all of these are NA, take ownermatch_b1 and put as ownerfinal . 2)如果有多个并行a非NA,则随机取其中任何一个作为ownerfinal )仅当所有这些都是NA时,将ownermatch_b1并作为ownerfinal

So in the example above: Firm A: Pick any of a1, a2, a3 Firm B: Pick b1 Firm C: Pick a3 Firm D: Pick either a2 or a3 因此,在上面的示例中:公司A:选择a1,a2,a3中的任何一个公司B:选择b1公司C:选择a3公司D:选择a2或a3

Thanks! 谢谢!

No need for loops here. 这里不需要循环。 ?max.col is your friend for finding valid cases across columns and picking one at random: ?max.col是您的朋友,可以跨列查找有效案例并随机选择一个案例:

tmp <- dat[2:4][cbind(seq_len(nrow(dat)), max.col(is.na(dat[2:4])))]
dat$ownerfinal <- replace(tmp, is.na(tmp), as.character(dat$ownermatch_b1)[is.na(tmp)])
dat

#  firmname ownermatch_a1 ownermatch_a2 ownermatch_a3 ownermatch_b1 ownerfinal
#1   Firm A       Owner 1       Owner 1       Owner 1       Owner 1    Owner 1
#2   Firm B          <NA>          <NA>          <NA>       Owner 2    Owner 2
#3   Firm C          <NA>          <NA>       Owner 3       Owner 3    Owner 3
#4   Firm D          <NA>       Owner 4       Owner 4       Owner 4    Owner 4
#5   Firm E       Owner 5       Owner 5       Owner 5       Owner 5    Owner 5
#6   Firm F       Owner 6       Owner 6       Owner 6       Owner 6    Owner 6

You could also use pmax if you want to take the first valid result: 如果要获得第一个有效结果,也可以使用pmax

do.call(pmax, c(lapply(dat[2:5],as.character), na.rm=TRUE) )
#[1] "Owner 1" "Owner 2" "Owner 3" "Owner 4" "Owner 5" "Owner 6"
doLookup <- function(x){
  for(i in 2:5){
    if(!is.na(x[i]))
      return(x[i])
  }
  return(NA)
}

#loop through each record and make assignment
for(j in 1:nrow(df))
   df[j,6] <- doLookup(df[j,])
df
  firmname ownermatch_a1 ownermatch_a2 ownermatch_a3 ownermatch_b1 ownerfinal
1   Firm A       Owner 1       Owner 1       Owner 1       Owner 1    Owner 1
2   Firm B          <NA>          <NA>          <NA>       Owner 2    Owner 2
3   Firm C          <NA>          <NA>       Owner 3       Owner 3    Owner 3
4   Firm D          <NA>       Owner 4       Owner 4       Owner 4    Owner 4
5   Firm E       Owner 5       Owner 5       Owner 5       Owner 5    Owner 5
6   Firm F       Owner 6       Owner 6       Owner 6       Owner 6    Owner 6

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM