嵌套的if/else if基于多个列值-R

嵌套的if/else if基于多个列值-R,r,R,目标是根据多个条件填充一个新列(df$final.count)。下面是一个示例数据框: structure(list(item = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L), .Label = c("a", "b"), class = "factor"), raw.count = c(16, 300, 203, 6, 5, 40, 20, 16, 300, 203), loc = structure(c(4L, 2L, 2L,

目标是根据多个条件填充一个新列(df$final.count)。下面是一个示例数据框:

structure(list(item = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
2L, 2L, 2L), .Label = c("a", "b"), class = "factor"), raw.count = c(16, 
300, 203, 6, 5, 40, 20, 16, 300, 203), loc = structure(c(4L, 
2L, 2L, 2L, 2L, 3L, 3L, 4L, 2L, 3L), .Label = c("  ", "in", "out", 
"NA"), class = "factor"), side = structure(c(4L, 2L, 3L, 2L, 
3L, 4L, 3L, 4L, 2L, 4L), .Label = c("F", "L", "R", "NA"), class = "factor"), 
    recount = c(15, NA, NA, 7, NA, NA, 16, 15, NA, NA), final.count = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, NA_real_, 
    NA_real_, NA_real_, NA_real_), EXPECTED = c(15, 60, 120, 
    7, 5, 40, 16, 15, 300, 203)), row.names = c(NA, 10L), class = "data.frame")
目标是根据影响多个列的以下条件填充新列(df$final.count):

  • 如果df$recount中有数字,则df$final.count中应使用df$recount。无条件计数到其他列值
  • 如果df$重新计数中没有数字(NA),且df$raw.count>10且df$loc为“in”,df$侧为“L”,则应使用函数0.2*df$raw.count填充df$final.count
  • 如果df$重新计数中没有数字(NA),且df$raw.count>10且df$loc为“in”,且df$侧为“R”,则应使用函数0.6*df$raw.count填充df$final.count(注意,只有侧不同)

  • 如果df$raw.count=如果您使用dplyr包中的
    case\u when()
    ,它会变得更可读。。您还可以松开的

    library( dplyr )
    df %>%
      mutate( final.cond = case_when(
        !is.na( recount ) ~ recount,
        item == "a" & raw.count > 10 & loc == "in" & side == "L" ~ 0.2 * raw.count,
        item == "a" & raw.count > 10 & loc == "in" & side == "R" ~ 0.6 * raw.count,
        raw.count <= 10 ~ raw.count,
        loc == "out" ~ raw.count,
        TRUE ~ as.numeric(NA)
      ))
    
    库(dplyr)
    df%>%
    突变(final.cond=情况_)(
    !is.na(重新计票)~重新计票,
    item==“a”&raw.count>10&loc==“in”&side==“L”~0.2*raw.count,
    item==“a”&raw.count>10&loc==“in”&side==“R”~0.6*raw.count,
    
    raw.count我不确定您的逻辑是否正确,但您在所有
    df$final.count
    中以及在最后两种情况下的
    raw.count
    中都缺少
    I
    。这是一个非常可读的解决方案,它通过一些调整解决了我的问题。还必须将最后一行更改为TRUE~as.numeric(NA)
    library( dplyr )
    df %>%
      mutate( final.cond = case_when(
        !is.na( recount ) ~ recount,
        item == "a" & raw.count > 10 & loc == "in" & side == "L" ~ 0.2 * raw.count,
        item == "a" & raw.count > 10 & loc == "in" & side == "R" ~ 0.6 * raw.count,
        raw.count <= 10 ~ raw.count,
        loc == "out" ~ raw.count,
        TRUE ~ as.numeric(NA)
      ))