0

私は初めての関数 (他のプログラミング言語を含む) を書いていますがifelseとの適切な構造について少し混乱していますifelse。たくさんの例を検索しましたが、それほど明確なものはありません。

状況 - 私は、クライアントがクライアントであった期間によってクライアントを分類し、それを要因に変えようとしています。

#Sample Data
clientID <- round(runif(2,min=2000, max=3000),0)
MonthsSinceSignUp <- round(runif(20,min=1, max=60),0)
df <- data.frame(cbind(clientID,MonthsSinceSignUp))

特定のクライアントについて、その状態が 1 年未満か、1 年以上か、2 未満かなどを判断したいと思います。

これは関数での私の最初のクラックです:

ClientAgeRange <- function(MonthsSinceSignUp) {
  if (MonthsSinceSignUp < 13) {ClientAgeRange <- '1 year'}
} else {
  if (MonthsSinceSignUp > 13 & MonthsSinceSignUps < 25) {ClientAgeRange <- '2 years'}
} else {ClientAgeRage <- '3+ years'}

私が取得し続けるエラーは次 Error: unexpected '}' in "}"のとおりです。これは、欠落しているか、余分な閉じ括弧があることを示します。しかし、トラブルシューティングを行っても、それを見つけることができません。しかし、一般的に、関数に正しい構造を適用していないと思います。を作成しようとしていif this, then set this variable as thatます。この関数を適切に構成するにはどうすればよいですか?

最後に、関数の出力を に追加したい場合、正しい方法dataframeはありますか?apply

4

3 に答える 3

5

2 つの部分からなる回答:

  1. 先端
  2. 修正

ヒント:

最初のヒントは、ブラケット マッチングを行うコード エディターを使用することです。たとえば、次のようにNotepad++なります。

PS。私はお勧めしませんNotepad++-代わりにRstudioを使用してください-私は単にNotepad++派手な(したがって見つけやすい)色のために使用しています

ここに画像の説明を入力

強調表示された中かっこ (赤) が、関数の途中にある中かっこと一致していることに注意してください。これは、最初の の最後に冗長なブレースがあることを示していますif。したがって、最初にそれを修正します。

ここに画像の説明を入力

OK、一致する中括弧がなくなったので (赤で強調表示されていません)、不足している中括弧を関数の最後に追加する必要があります。

ここに画像の説明を入力


修正:

cutしかし、この種の分析を行うように設計された を使用すると、関数を大幅に単純化できます。

ClientAgeRange <- function(x) {
  cut(x, breaks=c(0, 13, 25, Inf), labels=c("1 year", "2 years", "3+ years"))
}

あなたのコードで試してみてください:

ClientAgeRange(df$MonthsSinceSignUp)
 [1] 2 years  1 year   3+ years 2 years  3+ years 3+ years 2 years  2 years  3+ years 3+ years 1 year  
[12] 3+ years 2 years  3+ years 3+ years 3+ years 3+ years 3+ years 3+ years 3+ years
Levels: 1 year 2 years 3+ years
于 2012-07-30T16:25:29.110 に答える
2
if (MonthsSinceSignUp < 13) {ClientAgeRange <- '1 year'}
}

ここに余分な } があります。

原則として、コードをフォーマットするための規則を採用することをお勧めします。私が強くお勧めする規則の 1 つは、常に「ブロック」の本体を独自の行に配置することです (ここでは、関数本体、if ステートメント、およびループを含む「{} 内のもの」の総称としてブロックを使用しています)。 、 以下のように:

ClientAgeRange <- function(MonthsSinceSignUp) {
  if (MonthsSinceSignUp < 13) {
    ClientAgeRange <- '1 year'
  } else if (MonthsSinceSignUp > 13 & MonthsSinceSignUps < 25) {
    ClientAgeRange <- '2 years'
  } else {
    ClientAgeRage <- '3+ years'
  }
}

それがすべてをより明確にする方法がわかりますか?


2番目の質問に関しては、副作用のない関数は入力を受け取り、処理を行い、出力を返します。現在、戻り値はありません。命名規則からすると、少し混乱しているようです。

これを試して:

ClientAgeRange <- function(MonthsSinceSignUp) {
  if (MonthsSinceSignUp < 13) {
    result <- '1 year'
  } else if (MonthsSinceSignUp > 13 & MonthsSinceSignUps < 25) {
    result <- '2 years'
  } else {
    result <- '3+ years'
  }
  return(result)
}

return(R ではオプションですが、関数をより明確に考えるのに役立ちます。

于 2012-07-30T16:15:24.547 に答える
2

else if次のことを試してください(以前はもっと簡単にしていたことに注意してください):

ClientAgeRange <- function(MonthsSinceSignUp) {
  if (MonthsSinceSignUp < 13) {
      ClientAgeRange <- '1 year'
  } else if (MonthsSinceSignUp > 13 & MonthsSinceSignUp < 25) {
      ClientAgeRange <- '2 years'
  } else {ClientAgeRage <- '3+ years'}
} 

次に、次のようにデータフレームに追加できます。

df$ClientAgeRange <- sapply(MonthsSinceSignUp, ClientAgeRange)

あなたが言ったように、適用(この場合はsapplyを使用しました。たとえば、さまざまな適用機能について読むことができる場所がいくつかありますは正しい方法です。これは、単純にベクトル全体を関数に渡すことができないためです。必要な比較を行うには、個々の要素が必要です。

于 2012-07-30T16:16:24.553 に答える