11

lubridateパッケージ内の特殊な動作に遭遇しましたdmy(NA)。NAを返すだけでなく、エラーが発生します。これにより、NAである要素と、通常は問題なく変換される日付文字列を含む列を変換するときに問題が発生します。

最小限の例を次に示します。

library(lubridate)
df <- data.frame(ID=letters[1:5],
              Datum=c("01.01.1990", NA, "11.01.1990", NA, "01.02.1990"))
df_copy <- df
#Question 1: Why does dmy(NA) not return NA, but throws an error?
df$Datum <- dmy(df$Datum)
Error in function (..., sep = " ", collapse = NULL)  : invalid separator
df <- df_copy
#Question 2: What's a work around?
#1. Idea: Only convert those elements that are not NAs
#RHS works, but assigning that to the LHS doesn't work (Most likely problem::
#column "Datum" is still of class factor, while the RHS is of class POSIXct)
df[!is.na(df$Datum), "Datum"] <- dmy(df[!is.na(df$Datum), "Datum"])
Using date format %d.%m.%Y.
Warning message:
In `[<-.factor`(`*tmp*`, iseq, value = c(NA_integer_, NA_integer_,  :
invalid factor level, NAs generated
df #Only NAs, apparently problem with class of column "Datum"
ID Datum
1  a  <NA>
2  b  <NA>
3  c  <NA>
4  d  <NA>
5  e  <NA>
df <- df_copy
#2. Idea: Use mapply and apply dmy only to those elements that are not NA
df[, "Datum"] <- mapply(function(x) {if (is.na(x)) {
                                 return(NA)
                               } else {
                                 return(dmy(x))
                               }}, df$Datum)
df #Meaningless numbers returned instead of date-objects
ID     Datum
1  a 631152000
2  b        NA
3  c 632016000
4  d        NA
5  e 633830400

要約すると、2つの質問があります:1)dmy(NA)が機能しないのはなぜですか?他のほとんどの関数に基づいて、すべての変換(dmy()など)が(同じように)再びNA返されるのは良いプログラミング手法だと思いますか?この動作が意図されている場合、関数を介してsを含む列を変換するにはどうすればよいですか?NA2 + NAdata.frameNAdmy()

4

2 に答える 2

6

関数Error in function (..., sep = " ", collapse = NULL) : invalid separatorが原因です。lubridate:::guess_format()は、への呼び出しのように、特にでNA渡されます。これを修正するために、を改善することができます。seppaste()fmts <- unlist(mlply(with_seps, paste))lubridate:::guess_format()

NAそれ以外の場合は、を文字( )に変更できます"NA"か?

require(lubridate)
df <- data.frame(ID=letters[1:5],
    Datum=c("01.01.1990", "NA", "11.01.1990", "NA", "01.02.1990")) #NAs are quoted
df_copy <- df

df$Datum <- dmy(df$Datum)
于 2011-10-31T16:37:52.920 に答える
3

日付はかなり単純な形式であるため、適切な引数を使用as.Dateして指定する方がはるかに簡単な場合があります。format

df$Date <- as.Date(df$Datum, format="%d.%m.%Y")
df

  ID      Datum       Date
1  a 01.01.1990 1990-01-01
2  b       <NA>       <NA>
3  c 11.01.1990 1990-01-11
4  d       <NA>       <NA>
5  e 01.02.1990 1990-02-01

で使用されるフォーマットコードのリストを表示するには、を参照してas.Dateください。?strptime

于 2011-10-31T16:06:15.400 に答える