首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套if / else条件在多列值上-R

嵌套if / else条件在多列值上-R
EN

Stack Overflow用户
提问于 2018-12-05 07:37:53
回答 1查看 314关注 0票数 1

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

代码语言:javascript
复制
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,那么如果上面的1
  5. 如果df$loc是"out“而不是df$final.count <- df$raw.count,则无条件地对其他列值进行删除,如果上面的1仍然有效

我已经在循环中尝试过各种if / else的版本,例如:

代码语言:javascript
复制
  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
  }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-05 07:53:23

如果您使用来自dplyr包的case_when(),它将变得更加可读性。您也可以松掉for

代码语言:javascript
复制
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)
  ))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53627348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档