根据多个" OR"创建新变量。 R中预先存在的变量内的条件

时间:2014-12-17 06:40:56

标签: r if-statement conditional-statements

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

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

Maj2014["OuterOrLagoon"] <- NA

并创建了以下代码,试图使用&#34; if else&#34;解决问题的功能

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

所以基本上在我的新变量&#34; OuterOrLagoon&#34;我想调用SiteID为MA1,MA2,MA5,MA6,MA9和MA13的所有行 - &#34;外部&#34;和行MA3,MA7,MA8,MA10和MA15 - &#34; Lagoon&#34;。

所以第一个问题是,#34;我试图用来解决这个问题的方法和代码是正确的吗?&#34; 接下来是#34;如果正确,我该如何解决错误?&#34;

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

谢谢你,

泰森

2 个答案:

答案 0 :(得分:3)

你可以尝试

 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>

更新

关于后续工作,您需要&代替&&。根据{{​​1}}

?&

这应该有效:

 ‘&’ 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

答案 1 :(得分:0)

您可以在没有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])