如何在 R 中使用 'if' 语句来使用一系列可能值来操作数据集?

How do I use 'if' statements in R to manipulate a dataset using a range of possible values?

我正在使用 R 中的一个数据集(名为“AvianFatalities”)调查风力发电厂的鸟类死亡事件,我想问的是是什么让鸟类或多或少地与风力涡轮机相撞.我拥有的数据集是由该设施的个人在特定日子收集的,在这些日子里,一个人搜索了一系列涡轮机以确定是否存在尸体。个人注释了调查完成的月份日期(“天”范围:1-31),以及鸟死亡的估计天数(“DaysDead”范围:2-60)。如果没有找到鸟,“DaysDead”数据点是 'NA'.

此数据集告诉我发现尸体的日期和月份(“月份”范围:1-12),但我需要估计鸟类实际撞击涡轮机的月份,因此我创建了使用以下代码为更正后的月份创建一个新列(标题为“CorrMonth”):

AvianFatalities$CorrMonth<-NA

我现在有一个更正月份的列,我知道我应该能够使用一些代码组合来用正确的信息填充该列,例如:

If "Day"-"DaysDead" = -1 through -30, CorrMonth = Month-1

If "Day"-"DaysDead" = -31 through -60, CorrMonth = Month-2

Otherwise, CorrMonth = Month

如果在给定的一天在给定的涡轮机上没有发现鸟,在这种情况下,“DaysDead”是 'NA',我也想要“CorrMonth”=“Month”。我知道,或者我认为我知道,我不能将 if 语句应用于 R 数据框中的整个列,所以我将下面使用的向量设为“死”。

这是我目前使用的代码:


dead <- Day - DaysDead
if(dead<=-1&dead>=-30){AvianFatalities$CorrMonth <- AvianFatalities$Month-1}
else
{if(dead<=-30&dead>-60){AvianFatalities$CorrMonth <- AvianFatalities$Month-2}
  else
{AvianFatalities$CorrMonth <- AvianFatalities$Month}}

这给我以下错误:

> if(dead<=-1&dead>=-30){AvianFatalities$CorrMonth <- AvianFatalities$Month-1}
Error in if (dead <= -1 & dead >= -30) { : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
In if (dead <= -1 & dead >= -30) { :
  the condition has length > 1 and only the first element will be used
> else
Error: unexpected 'else' in "else"
> {if(dead<=-30&dead>-60){AvianFatalities$CorrMonth <- AvianFatalities$Month-2}
+  else
+  {AvianFatalities$CorrMonth <- AvianFatalities$Month}}
Error in if (dead <= -30 & dead > -60) { : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
In if (dead <= -30 & dead > -60) { :
  the condition has length > 1 and only the first element will be used

我尝试使用以下方法更正一个错误:

record <- dead[which[dead!='NA']]

for(i in record){
if(dead<=-1&dead>=-30){AvianFatalities$CorrMonth <- AvianFatalities$Month-1}
else
{if(dead<=-30&dead>-60){AvianFatalities$CorrMonth <- AvianFatalities$Month-2}
  else
{AvianFatalities$CorrMonth <- AvianFatalities$Month}}
}

并得到以下信息:

> record <- dead[which[dead!='NA']]
Error in which[dead != "NA"] : 
  object of type 'closure' is not subsettable

我不知道还有什么方法可以纠正我在尝试将此语句应用于我的数据集时遇到的错误。任何建议将不胜感激。

创建数据。

x <- data.frame(day = c(15,5,20,12),
                daysdead = c(10,15,55,NA),
                month = c(6,7,9,11),
                carcasses = c(14,1,7,0))

您想要矢量化 if/else,因此您应该使用 ifelse 函数:

x$CorrMonth <- x$month
x$CorrMonth <- ifelse(-1 >= (x$day - x$daysdead) & 
                      (x$day - x$daysdead) >= -30,
                      x$CorrMonth - 1, x$CorrMonth)

x$CorrMonth <- ifelse(-31 >= (x$day - x$daysdead) &
                       (x$day - x$daysdead) >= -60,
                      x$CorrMonth - 2, x$CorrMonth)
x$CorrMonth[is.na(x$CorrMonth)] <- x$month[is.na(x$CorrMonth)]                

>     x
  day daysdead month carcasses CorrMonth
1  15       10     6        14         6
2   5       15     7         1         6
3  20       55     9         7         7
4  12       NA    11         0        11