簡體   English   中英

R中數據框的Ifelse語句

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM