【问题标题】:how to make new column with if and else condition如何使用 if 和 else 条件创建新列
【发布时间】:2020-05-10 12:04:17
【问题描述】:

当我想用 mutate 创建新列但上面有 if 条件状态时我应该怎么做。

示例:

dt <- read.table(text="
name,gender,fat_%
adam,male,32
anya,female,27
gilang,male,24
andine,female,34
",sep=',',header=TRUE) 


## + > dt
##       name gender fat_.
##   1   adam   male    32
##   2   anya female    27
##   3 gilang   male    24
##   4 andine female    34

我的问题: 如果我想创建新的专栏,我必须写什么代码来回答“是”或“否”。 我的新专栏将是这样的:

name      gender      fat_%      obesity
adam       male       32           yes
anya      female      27           no
gilang     male       24           yes
andine    female      34           no

注意:找到肥胖的公式是 (if male &amp; fat &gt; 26 = yes ,if girl &amp; fat &gt;32 = yes) if (if male &amp; fat &lt; 26 = no ,if girl &amp; fat &lt;32 = no)

【问题讨论】:

  • 欢迎来到stackoverflow。我建议these 发布新问题的准则。他们会增加你获得帮助的机会
  • 这个问题已经回答了。例如herehere
  • 这能回答你的问题吗? Nested ifelse statement
  • 如果对您有用,最好接受解决方案。

标签: r if-statement dplyr


【解决方案1】:

先提几个建议。性别可以是单个字符 M/F。您不能在列名中使用 %。您的列名“胖”,您可能是指 BMI??

这对你有用吗?

dt %>% 
  mutate (newcol = ifelse ((gender == "male"), (ifelse ((fat_ > 26), TRUE, FALSE)),
                           (ifelse ((fat_ > 32), TRUE, FALSE))))

【讨论】:

    【解决方案2】:

    两种解决方案。 首先,base Rsolution:

    df$obesity <- ifelse (df$gender == "m" & df$fat_ > 26 , "yes",
                           ifelse(df$gender == "f" & df$fat_ > 32, "yes", "no"))
    

    使用mutatefrom dplyr,基于dplyrs if_else 而不是base Rifelse 的更紧凑的代码是这样的:

    df %>% 
      mutate(obesity = if_else(gender=="m" & fat_ > 26|gender=="f" & fat_ > 32, "yes", "no"))
    

    结果:

    df
        name gender fat_ obesity
    1   adam      m   32     yes
    2   anya      f   27      no
    3 gilang      m   24      no
    4 andine      f   34     yes
    

    数据:

    df <- data.frame(
      name = c("adam", "anya", "gilang", "andine"),
      gender = c("m", "f", "m", "f"),
      fat_ = c(32,27,24,34)
    )
    

    【讨论】:

      【解决方案3】:

      一种方法是使用来自dplyrcase_when

      library(dplyr)
      df %>% 
        mutate(obesity = case_when(gender == "male" & fat > 26 ~ "yes",
                                   gender == "female" & fat > 32 ~ "yes",
                                   TRUE ~ "no"))
      #    name gender fat obesity
      #1   adam   male  32     yes
      #2   anya female  27      no
      #3 gilang   male  24      no
      #4 andine female  34     yes
      

      一旦你理解了语法,它就会经常派上用场。

      数据

      structure(list(name = structure(c(1L, 3L, 4L, 2L), .Label = c("adam", 
      "andine", "anya", "gilang"), class = "factor"), gender = structure(c(2L, 
      1L, 2L, 1L), .Label = c("female", "male"), class = "factor"), 
          fat = c(32, 27, 24, 34)), class = "data.frame", row.names = c(NA, 
      -4L))
      

      【讨论】:

      • 天哪,它起作用了...非常感谢...过去 3 天我一直在思考
      猜你喜欢
      • 1970-01-01
      • 2014-03-09
      • 2021-08-28
      • 2017-05-05
      • 1970-01-01
      • 2020-12-21
      • 1970-01-01
      • 2016-11-24
      相关资源
      最近更新 更多