2017-03-06 7 views
1

ここは私が理解するのに苦労しているものです。なぜdplyr :: filter()に条件がFalseのデータが含まれていますか?

**Year**  **Date** 
1925   1925-01-02 
1941   1925-02-03 
1990   1990-01-02 
1956   NA 
1990   1990-01-02 
2002   2004-01-02 

そして、私は**Year**列の値が**Date**列の年と一致していないこれらのエントリのすべてをフィルタリングしようとしています:私は2列を持つデータフレームを持っている想像してみてください。

dateParser <- function(date) { 
    dateStr <- toString(date) 
    yearStr <- strsplit(dateStr, "-")[[1]][1] 
    yearInt <- as.integer(yearStr) 

    return(yearInt) 
} 

、その後、私はそれらの出現をフィルタリングするdplyr::filter()を使用しています:

noMismatch <- dplyr::filter(data, as.integer(data$Year) == dateParser(data$Date)) 
だから、私は非常に大きなデータセットを想定し 列のために、小さなパーサを書かれている

しかし、私は年が一致しない結果のデータフレームにいくつかの行が表示されています。どうして?

P.S.のは、私が**Date**コラムでは約NA値を気にしないとNAが発生するたびに、私はちょうどこの行を残していますと仮定しよう。

+1

エラーは、現在のデータのサンプルで発生していますか?年はどのクラスですか?私は 'lubridate :: year()'を使用します。 –

+1

'strsplit(dateStr、" - ")[[1]] [1]'を見てください。これは最初の行からの単一要素です。すべての行をカバーするベクトルの代わりにそれを使用すると、奇妙な結果が得られるのは当然です。 – Frank

+0

@Frank、私はあなたがポイントを持っているように感じる、ベクトル化されたソリューションがどのように見えるかを詳しく教えていただけますか?私はまだRのベクトル化された性質に合わせて問題を抱えていると思う。 –

答えて

1

これはおそらく、あなたの

dateParser(data$Date) 

」はdoesnの事実に関係していますあなたが探しているものをデータフォーマットの点で返す。

試してみてください。

library(lubridate) 
library(dplyr) 
noMismatch <- filter(data, as.integer(data$Year) == year(data$Date)) 
関連する問題