我想根据预先存在的变量中的多个条件在我的数据框中插入一个新变量我已经在我的数据集中有一个变量(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;
我意识到这可能是一个相对简单的问题,但如果有人可以请求帮助那就太棒了!
谢谢你,
泰森
答案 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])