4

誰かが私のデータセットで機能するif-elseステートメントを書く方法を理解するのを手伝ってくれることを願っています。年ごとの樹木の成長率に関するデータがあります。成長率が1年から次の年に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"]比較された2つのベクトルの長さが異なるため、警告がスローされます。また、論理積とについては、使用&&する必要があるときに(1つのTRUEまたはFALSEのみを与える)を使用して&います(ベクトル化されています。2つのベクトルに対して要素ごとに動作し、同じ長さのベクトルを返します)。これを試して:

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

次に、BlueMagisterが言ったように論理演算子を修正します。

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 に答える