2016-08-08 1 views
0

ExcelのEOMonth関数を複製する関数を作成しようとしています(つまり、日付と月数を入力して、入力日の前/後の同じ月数)。私はlubridateパッケージを使用して、単一入力で動作機能を持っている:ユーザー定義ファンクションを使用してベクトルでNAsを処理する

EOMonth <- function(date, months) 
{ 
    NewDate <- date %m+% months(months) 
    NewDate <- ceiling_date(NewDate, "month") - days(1) 
} 

問題がどのように「vectorise」は、この(わからないことは右の単語)に。私は(この場合、データフレームの列)ベクトル関数を渡すときに、私は次のメッセージが表示されます:

NASが、私はしたくない添字の割り当てに

を許可されていません(データフレーム内の新しい列に結果を送信しているため)ベクトルのNAsを無視します。 NAを見てNAを返すだけで、関数が指示するすべての有効な日付を処理するだけの機能だけが必要です。私は本当にこれを行う方法については混乱しています。このトピックで見た投稿のほとんどは、結果からNAsを無視/削除する方法に関連しています。

ご協力いただければ幸いです。

ありがとうございました。

編集。いくつかのサンプルデータを追加しました。以下のサンプルの入力データである:

ので
01/07/2016 
NA 
22/07/2016 
NA 
30/06/2016 
22/07/2016 
22/07/2016 
29/07/2016 
NA 
22/07/2016 
30/06/2016 
NA 
31/01/2016 
02/08/2016 

、次のように入力:

31/10/2016 
NA 
31/10/2016 
NA 
30/09/2016 
31/10/2016 
31/10/2016 
31/10/2016 
NA 
31/10/2016 
30/09/2016 
NA 
NA 
30/04/2016 
30/11/2016 
+0

サンプルデータはありますか?これは、人々があなたの質問に素早く答えるチャンスを大いに承認します。 –

+0

こんにちはサンダー。確かに。オリジナルのコメントに貼り付けるだけですか?私はサイト上で質問することはめったにないので、まあまあです。ごめんなさい。 – sotiris

+0

質問を編集してサンプルデータを追加することができます。あなたは、あなたのデータフレーム上で '' 'head(dput())' 'を単に行うことができます。 –

答えて

1

newVector <- EOMonth(OldVector, 3) 

は、3ヶ月後の日付ごとに月の終わりを返す必要があります

解決策の1つは、最初にNAのベクトルを作成し、dateという非NA要素だけを処理することです。 NAクラスはdateである必要があります。また、日付は数値に変換されます。

EOMonth <- function(date, months) 
{ 
    NewDate <- date(rep(NA, length(date))) 
    NewDate[!is.na(date)] <- date[!is.na(date)] %m+% months(months) 
    NewDate[!is.na(date)] <- ceiling_date(NewDate[!is.na(date)], "month") - days(1) 
    NewDate 
} 

EOMonth(OldVector, 3) 
+0

これは華麗で、魅力的です。ありがとう、リチャード。私の答えとなります。 – sotiris

関連する問題