[英]Ifelse statements for a dataframe in R
我希望有人可以幫我弄清楚如何編寫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語句,我將非常感激! 感謝您提供任何幫助。
謝謝,凱蒂
這是一個警告,因為兩個向量比較abs(test$diff) >= test[-nrow(test),"chg"]
有不同的長度。 另外,對於邏輯和 ,當你應該使用&
(它是矢量化的:它在兩個向量上按元素運算並返回相同長度的向量),你使用&&
(它只給出一個TRUE或FALSE)。 試試這個:
test$abrupt<-ifelse(test$diff<0 & abs(test$diff)>=test$chg,1,0)
我會改變你放置chg
以便它與你要比較的diff
chg
一行:
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.