【问题标题】:Is it possible to add a third dummy variable using ifelse() in R?是否可以在 R 中使用 ifelse() 添加第三个虚拟变量?
【发布时间】:2017-08-11 19:32:56
【问题描述】:

我使用此代码根据列 var 中找到的 2 个组 SuiSwe 的部分字符串创建一个新的 Group 列。我不得不添加另一个组TRD,并且我一直在尝试调整ifelse 函数来做到这一点,但没有成功。这是可行的吗?是否有任何其他解决方案或其他功能可以帮助我做到这一点?

m.df <- molten.df%>% mutate(
Group = ifelse(str_detect(variable, "Sui"), "Sui", "Swedish"))

Current m.df: 
                          var      value    
  ADHD_iFullSuiTrim.Threshold1 0.00549427     
  ADHD_iFullSuiTrim.Threshold1 0.00513955     
  ADHD_iFullSweTrim.Threshold1 0.00466352   
  ADHD_iFullSweTrim.Threshold1 0.00491633   
  ADHD_iFullTRDTrim.Threshold1 0.00658535    
  ADHD_iFullTRDTrim.Threshold1 0.00609122    


Desired Result:
                          var      value    Group
   ADHD_iFullSuiTrim.Threshold1 0.00549427    Sui  
   ADHD_iFullSuiTrim.Threshold1 0.00513955    Sui  
   ADHD_iFullSweTrim.Threshold1 0.00466352   Swedish
   ADHD_iFullSweTrim.Threshold1 0.00491633   Swedish
   ADHD_iFullTRDTrim.Threshold1 0.00658535    TRD
   ADHD_iFullTRDTrim.Threshold1 0.00609122    TRD  

即使结果可以使用其他功能完成,任何帮助或建议都将不胜感激。

【问题讨论】:

  • 似乎case_when 可能有用。
  • 请分享您的数据框和代码的可重现示例。

标签: r dataframe dplyr grouping dummy-variable


【解决方案1】:

不需要ifelse()。我会使用Group = str_extract(var, pattern = "(Sui)|(TRD)|(Swe)")

您可以通过“iFull”的后视和“Trim”的前瞻来做更高级的正则表达式,但我永远不记得如何做到这一点。

更多的回旋处,但一般来说,如果您想要“iFull”和“Trim”之间的任何内容,则可以替代:

str_replace_all(var, pattern = "(.*iFull)|(Trim.*)", "")

【讨论】:

    【解决方案2】:

    尝试使用多个ifelse

    library(dplyr)
    library(stringr)
    
    m.df <- molten.df %>% 
      mutate(Group = ifelse(str_detect(var, "Sui"), "Sui", 
                            ifelse(str_detect(var, "Swe"), "Swedish", "TRD")))
    

    case_when

    m.df <- molten.df %>% 
      mutate(Group = case_when(
        str_detect(var, "Sui") ~ "Sui",
        str_detect(var, "Swe") ~ "Swe",
        TRUE                   ~ "TRD"
      ))
    

    数据准备

    molten.df <- read.table(text = "var      value    
      'ADHD_iFullSuiTrim.Threshold1' 0.00549427     
                     'ADHD_iFullSuiTrim.Threshold1' 0.00513955     
                     'ADHD_iFullSweTrim.Threshold1' 0.00466352   
                     'ADHD_iFullSweTrim.Threshold1' 0.00491633   
                     'ADHD_iFullTRDTrim.Threshold1' 0.00658535    
                     'ADHD_iFullTRDTrim.Threshold1' 0.00609122",
                    header = TRUE, stringsAsFactors = FALSE)
    

    【讨论】:

      【解决方案3】:

      供将来参考 - 提供重复分析所需的所有组件,例如包和示例数据

      # load ----
      library(dplyr)
      library(stringr)
      
      # data ----
       df=data.frame(var=c('ADHD_iFullSuiTrim.Threshold1',
        'ADHD_iFullSuiTrim.Threshold1',
        'ADHD_iFullSweTrim.Threshold1',
        'ADHD_iFullSweTrim.Threshold1',
        'ADHD_iFullTRDTrim.Threshold1', 
        'ADHD_iFullTRDTrim.Threshold1'),
         value = c(0.00549427, 0.00513955, 0.00466352, 0.00491633, 0.00658535, 0.00609122))    
      
      df %>% 
          mutate(Group = case_when(str_detect(var, "Sui")~"Sui",
                                       str_detect(var, "Swe")~"Swedish",
                                       str_detect(var, "TRD")~"TRD"))
      

      【讨论】:

      • 谢谢。这很有帮助我是新来的,不太了解如何格式化我的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2019-06-23
      • 2023-02-10
      • 2021-08-08
      • 2015-10-23
      • 1970-01-01
      • 2020-01-16
      相关资源
      最近更新 更多