【问题标题】:What is the simplest way to recode a variable based on conditions of another variable in R?根据R中另一个变量的条件重新编码变量的最简单方法是什么?
【发布时间】:2015-05-07 14:19:35
【问题描述】:

愚蠢的例子df,“猫”:

species color tail_length
calico  brown     6
calico  gray      6
tabby   multi     5
tabby   brown     5

假设我想创建一个新变量,personality。此处的值将根据 tail_length 重新编码,但也取决于猫的种类和颜色。所以理想的最终df应该是这样的:

species color tail_length personality
calico  brown     6          mean
calico  gray      6          nice
tabby   multi     5          mean
tabby   brown     5          nice

目前我使用的是代码:

library(car)
cat$personality<-recode(cat$tail_length, "'6'==mean, '5'==nice")
cat$personality[cat$species=="calico" & cat$color=="brown"] <- mean
cat$personality[cat$species=="calico" & cat$color=="gray"] <- nice
cat$personality[cat$species=="tabby" & cat$color=="multi"]<- mean
cat$personality[cat$species=="tabby" & cat$color=="brown"]<-nice

我的主要问题是:有没有一种更简单的方法可以做到这一点/将这些功能整合为一个? 鉴于我在飞行中编造了这个示例数据,请在回答时持保留态度。 谢谢!作为 R 初学者,我非常感谢您的帮助。

【问题讨论】:

    标签: r conditional-statements recode


    【解决方案1】:

    您在这里无能为力,因为归根结底,您仍然需要指定要分配的条件和新变量。

    但是,您可以使用 within 减少样板代码:

    within(cat, {
      personality <- recode(tail_length, "'6'==mean, '5'==nice")
      personality[species == "calico" & color == "brown"] <- "mean"
      personality[species=="calico" & color=="gray"] <- "nice"
      personality[species=="tabby" & color=="multi"] <- "mean"
      personality[species=="tabby" & color=="brown"] <- "nice"
    })
    

    【讨论】:

      【解决方案2】:

      这是使用 qdapqdapTools(我维护的 CRAN 包)的一种方法:

      library(qdap); library(qdapTools)
      
      key <- list(
          mean = c( "calico.gray", "tabby.brown"),
          nice = c("calico.brown", "tabby.multi")
      )
      
      dat[["personality"]] <- paste2(dat[1:2]) %l% key
      dat
      
      ##   species color tail_length personality
      ## 1  calico brown           6        nice
      ## 2  calico  gray           6        mean
      ## 3   tabby multi           5        nice
      ## 4   tabby brown           5        mean
      

      基本上,您创建一个基于组合列的命名列表的键。然后%l%充当哈希表查找。

      【讨论】:

        【解决方案3】:

        这实际上只是一个merge 操作。 (此外,您已经过度指定了标准,因为 speciestail_length 完全依赖。但这只是一个可能不是问题的示例。)假设您的第一个数据框是 dat 并且标准数据框是 @ 987654325@。那么你需要做的就是:

        > merge(dat, lookup)
          species color tail_length personality
        1  calico brown           6        mean
        2  calico  gray           6        nice
        3   tabby brown           5        nice
        4   tabby multi           5        mean
        

        不是一个非常有趣或戏剧性的结果,因为它看起来就像 lookup 数据框,但给它一些更大的东西:

        > merge( rbind(dat,dat,dat) , lookup)
           species color tail_length personality
        1   calico brown           6        mean
        2   calico brown           6        mean
        3   calico brown           6        mean
        4   calico  gray           6        nice
        5   calico  gray           6        nice
        6   calico  gray           6        nice
        7    tabby brown           5        nice
        8    tabby brown           5        nice
        9    tabby brown           5        nice
        10   tabby multi           5        mean
        11   tabby multi           5        mean
        12   tabby multi           5        mean
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-29
          • 1970-01-01
          • 2017-05-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多