【问题标题】:Create new variable based off multiple "OR" conditions within a pre-existing variable in R根据 R 中预先存在的变量中的多个“OR”条件创建新变量
【发布时间】:2014-12-17 06:40:56
【问题描述】:

我想根据预先存在的变量中的多个条件在我的数据框中插入一个新变量我的数据集中已经有一个变量(数据集-Maj2014),“SiteID”,它是一个包含站点的变量名称(例如 MA1、MA2...等),我希望使用此信息创建一个新变量“OuterOrLagoon”,该变量基于站点名称并将站点分配为“Lagoon”(即泻湖内的站点) 或“外层”(即外礁上的一个地点)。

到目前为止,我已经创建了新变量并用 NA 填充它

Maj2014["OuterOrLagoon"] <- NA

并创建了以下代码以尝试使用“if else”功能来解决问题

Maj2014$OuterOrLagoon <- ifelse(Maj2014$SiteID == MA1|MA2|MA5|MA6|MA9|MA13, "Outer",
ifelse(Maj2014$SiteID == MA3|MA7|MA8|MA10|MA15, "Lagoon"))  

但是它返回以下错误

Error in ifelse(Maj2014$SiteID == MA1 | MA2 | MA5 | MA6 | MA9 | MA13,  : 
object 'MA1' not found

所以基本上在我的新变量“OuterOrLagoon”中,我想调用 SiteID 为 MA1、MA2、MA5、MA6、MA9 和 MA13 -“Outer”的任何行以及 MA3、MA7、MA8、MA10 和 MA15 的行- “泻湖”。

所以第一个问题是,“我试图用来解决这个问题的方法和代码是否正确?” 接下来是“如果正确,我该如何修复错误?”

我意识到这可能是一个相对简单的问题,但如果有人能帮忙,那就太好了!

谢谢你,

泰森

【问题讨论】:

    标签: r if-statement conditional-statements


    【解决方案1】:

    你可以试试

     Maj2014$OuterOrLagoon  <- with(Maj2014, ifelse(SiteID %in%
            c('MA1','MA2','MA5','MA6','MA9','MA13'), "Outer",
         ifelse(SiteID %in% c('MA3','MA7','MA8','MA10','MA15'), "Lagoon", NA)))  
    
     head(Maj2014)
     # SiteID        val OuterOrLagoon
     #1    MA5  0.4892584         Outer
     #2    MA4  0.2526488          <NA>
     #3   MA11 -1.6783948          <NA>
     #4    MA8 -0.7103328        Lagoon
     #5   MA10 -1.0449426        Lagoon
     #6   MA14 -0.7980727          <NA>
    

    更新

    关于后续,您需要&amp; 代替&amp;&amp;。根据?&amp;

     ‘&’ and ‘&&’ indicate logical AND and ‘|’ and ‘||’ indicate
     logical OR.  The shorter form performs elementwise comparisons in
     much the same way as arithmetic operators.  The longer form
     evaluates left to right examining only the first element of each
     vector.  Evaluation proceeds only until the result is determined.
     The longer form is appropriate for programming control-flow and
     typically preferred in ‘if’ clauses.
    

    这应该可行:

    RM12014$Complexity <- with(RM12014, ifelse(SiteID == 'RT8' & Depth == 10, 5,
                                     ifelse(SiteID=='RT8' & Depth ==3, 5, NA)) )
    
    head(RM12014)
    # SiteID Depth Complexity
    #1    RT7    10         NA
    #2    RT7     3         NA
    #3    RT7     3         NA
    #4    RT8     3          5
    #5    RT7     3         NA
    #6    RT8     7         NA
    

    数据

     set.seed(24)
     Maj2014 <- data.frame(SiteID= sample(paste0('MA',1:15),25,
                  replace=TRUE), val=rnorm(25))
    
     set.seed(28)
     RM12014 <- data.frame(SiteID= sample(paste0('RT', 7:8), 25, 
                replace=TRUE), Depth= sample(c(3,10,7), 25, replace=TRUE))
    

    【讨论】:

    • 谢谢,第一段代码运行良好,将站点分配到“Lagoon”或“Outer”。但是,我如何将这些信息分配到“OuterOrLagoon”变量中?查看数据集时,它没有插入到变量空间中?
    • @TysonMartin 如果您注意到代码和数据,我没有将变量 OuterOrLagoon 创建为 NA,但即使是这样,代码也应该可以工作。
    • 非常感谢,我刚刚将它分配给变量,它工作!谢谢!
    • 能否请您帮忙跟进 qn。现在尝试将您的建议应用于相同的数据,但这次需要满足 2 个条件并且没有。分配给符合这两个条件的新变量的行。 RMI2014$Complexity
    【解决方案2】:

    没有ifelse,你可以更有效地做到这一点:

    transform(Maj2014, 
              OuterOrLagoon = c("Lagoon", NA, "Outer")
              [(tmp <- as.integer(sub("\\D+", "", SiteID))) %in% c(1, 2, 5, 9, 13) -
                 tmp %in% c(3, 7, 8, 10, 15) + 2])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-13
      • 2018-09-14
      • 2022-01-08
      • 1970-01-01
      • 2022-07-15
      • 1970-01-01
      • 2015-05-07
      相关资源
      最近更新 更多