我希望有人可以帮我弄清楚如何编写if-else语句来处理我的数据集。我有一年的树木生长率数据。我需要计算一年到下一年的增长率是否下降了> 50%。我无法应用ifelse语句来计算我的最终字段。我对R比较陌生,所以我的代码可能效率不高,但这是我到目前为止的一个例子: 对于示例数据集,
test<-data.frame(year=c("1990","1991","1992","1993"),value=c(50,25,20,5))
year value
1 1990 50
2 1991 25
3 1992 20
4 1993 5
然后我计算当前年份与上一年度增长之间的差异(“价值”):
test[-1,"diff"]<-test[-1,"value"]-test[-nrow(test),"value"]
year value diff
1 1990 50 NA
2 1991 25 -25
3 1992 20 -5
4 1993 5 -15
然后计算每年50%的增长率:
test$chg<-test$value * 0.5
year value diff chg
1 1990 50 NA 25.0
2 1991 25 -25 12.5
3 1992 20 -5 10.0
4 1993 5 -15 2.5
然后我尝试使用ifelse语句计算一个字段“突然”,当从一年到下一年的下降大于50%时,该字段将为“1”。这是我试图使用的代码,但我不确定如何正确引用上一年的“chg”字段,因为我收到错误(复制如下):
test$abrupt<-ifelse(test$diff<0 && abs(test$diff)>=test[-nrow(test),"chg"],1,0)
Warning message:
In abs(test$diff) >= test[-nrow(test), "chg"] :
longer object length is not a multiple of shorter object length
> test
year value diff chg abrupt
1 1990 50 NA 25.0 NA
2 1991 25 -25 12.5 NA
3 1992 20 -5 10.0 NA
4 1993 5 -15 2.5 NA
当我刚刚分配了一些数字时,对类似的ifelse语句进行了测试,但我不确定如何在数据帧的上下文中使用它。以下是一个仅处理几个值的示例:
prevyear<-50
curryear<-25
chg<-prevyear*0.5
> chg
[1] 25
> diff<-curryear-prevyear
> diff
[1] -25
> abrupt<-ifelse(diff<0 && abs(diff)>= chg,1,0)
> abrupt
[1] 1
如果有人可以帮我弄清楚如何在我的数据框架中应用类似的ifelse语句,我将非常感激!感谢您提供的任何帮助。
谢谢你, 凯蒂答案 0 :(得分:4)
它正在发出警告,因为比较abs(test$diff) >= test[-nrow(test),"chg"]
的两个向量具有不同的长度。另外,对于 logical和,当你应该使用&&
时,你正在使用&
(它只给出一个TRUE或FALSE)(它是矢量化的:它在两个元素上运行向量并返回相同长度的向量)。试试这个:
test$abrupt<-ifelse(test$diff<0 & abs(test$diff)>=test$chg,1,0)
答案 1 :(得分:3)
我会改变您放置chg
的位置,以便与您想要将其进行比较的diff
对齐:
test$chg[2:nrow(test)] <- test$value[1:(nrow(test)-1)] * 0.5
然后,像Blue Magister说的那样纠正你的逻辑运算符:
test$abrupt<-ifelse(test$diff<0 & abs(test$diff)>=test$chg,1,0)
你有结果:
year value diff chg abrupt
1 1990 50 NA NA NA
2 1991 25 -25 25.0 1
3 1992 20 -5 12.5 0
4 1993 5 -15 10.0 1
此外,您可能会发现函数diff
很有用:而不是这样做:
test[-1,"value"]-test[-nrow(test),"value"]
你可以做到
diff(test$value)