4

我希望有人可以帮助我弄清楚如何编写 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 语句的测试有效,但我不确定如何让它在 datframe 的上下文中工作。这是一个仅处理几个值的示例:

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 语句应用于我的数据框,我将不胜感激!感谢您提供任何帮助。

谢谢你,凯蒂

4

2 回答 2

4

它发出警告,因为比较的两个向量abs(test$diff) >= test[-nrow(test),"chg"]具有不同的长度。此外,对于逻辑 and,您在&&应该使用时使用(它只给出一个 TRUE 或 FALSE)&(它是矢量化的:它在两个向量上逐元素操作并返回一个相同长度的向量)。尝试这个:

test$abrupt<-ifelse(test$diff<0 & abs(test$diff)>=test$chg,1,0)
于 2013-01-22T20:01:53.840 回答
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)
于 2013-01-22T20:06:04.423 回答