簡體   English   中英

如果條件為/則嵌套在多個列值上-R

[英]nested if / else if conditional on multiple column values - 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, 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):

  1. 如果df $ recount中的數字大於df $ recount,則應在df $ final.count中使用,而無其他條件
  2. 如果df $ recount中沒有數字(NA)並且df $ raw.count> 10並且df $ loc是“ in”並且df $ side是“ L”,則應使用0.2 * df $ raw.count函數進行填充DF $ final.count
  3. 如果df $ recount中沒有數字(NA)並且df $ raw.count> 10並且df $ loc是“ in”並且df $ side是“ R”,則應使用函數0.6 * df $ raw.count進行填充df $ final.count(僅注意一側不同)
  4. 如果df $ raw.count = <10,則df $ raw.count小於10,如果上述1成立
  5. 如果df $ loc是“ out”,則比df $ final.count <-df $ raw.count無條件,除非上述1滿足

我已經嘗試過各種版本的if / else if,例如:

  for (i in 1:nrow(df)) {
  if(!is.na(df$recount[i]) {
    df$final.count <- df$recount
  }
  else if(df$item[i] == "a" & df$raw.count[i] > 10 & df$loc[i] == "in" & df$side[i] == "L") {
    df$final.count <- 0.2*df$raw.count[i]
  }
  else if(df$item[i] == "a" & df$raw.count[i] > 10 & df$loc[i] == "in" & df$side[i] == "R") {
    df$final.count <- 0.6*df$raw.count[i]
  }
  else if(df$raw.count <= 10){
    df$final.count <- df$raw.count
  }
  else(df$loc == "out") {
    df$final.count <- df$raw.count
  }
}

如果您使用dplyr-package中的case_when() ,則它變得更具可讀性..您也可以松開for

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)
  ))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM