gpt4 book ai didi

r - 为什么 lubridate 包中的 dmy() 不适用于 NA?什么是好的解决方法?

转载 作者:行者123 更新时间:2023-12-04 02:13:28 25 4
gpt4 key购买 nike

我在 lubridate 中偶然发现了一个奇怪的行为。包裹:dmy(NA) trows 一个错误,而不是仅仅返回一个 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

总而言之,我有两个问题:1)为什么 dmy(NA) 不起作用?基于大多数其他函数,我认为 NA 的每个转换(例如 dmy())都是很好的编程习惯。返回 NA再次(就像 2 + NA 一样)?如果这种行为是有意的,我该如何转换 data.frame包含 NA 的列s 通过 dmy()功能?

最佳答案

Error in function (..., sep = " ", collapse = NULL) : invalid separator是由 lubridate:::guess_format() 引起的功能。 NA被传递为 sep调用 paste() ,特别是在 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)

关于r - 为什么 lubridate 包中的 dmy() 不适用于 NA?什么是好的解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7955797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com