gpt4 book ai didi

r - 使用 POSIXlt 完成.cases 和 data.frames

转载 作者:行者123 更新时间:2023-12-02 15:32:38 25 4
gpt4 key购买 nike

我主要是一名 Python 程序员,但仍在学习 R。我遇到问题的数据可用 here ,但我在下面做了一个关于这个问题的小例子。

R 的 complete.cases() 函数应返回一个逻辑向量,指示测试对象的哪些行不包含 NA 值。

df <- data.frame(val1=c(1, 2, NA, 4),
val2=c("12:00", "10:30", "09:15", "05:00"))
print(df)
## val1 val2
## 1 1 12:00
## 2 2 10:30
## 3 NA 09:15
## 4 4 05:00

print(length(df$val1) == length(df$val2))
## [1] TRUE

complete.cases(df)
## [1] TRUE TRUE FALSE TRUE

这按预期工作:一个 False 值,对应于 df$val1 中的 NA 值。

<小时/>

我遇到了一个问题,在通过 strptime 将字符向量转换为 POSIXlt 向量后,complete.cases 不再由于以下错误而工作:

complete.cases(df) 中的错误:并非所有参数都具有相同的长度

例如:

df$val2 <- strptime(df$val2, format="%H:%M")
print(df)
## val1 val2
## 1 1 2015-01-14 12:00:00
## 2 2 2015-01-14 10:30:00
## 3 NA 2015-01-14 09:15:00
## 4 4 2015-01-14 05:00:00

print(length(df$val1) == length(df$val2))
## [1] TRUE

complete.cases(df) # This line now causes the error.

如您所见,df$val1df$val2 的长度仍然相同。我在这里错过了什么吗?为什么在我使用 strptime 转换时间字符串后,complete.cases 会停止工作?

我确信我可以解决这个特定问题(我真的不需要通过strptime转换数据),我只是好奇为什么complete.cases 不适合我。

<小时/>

系统信息:

  • R 版本 3.1.1 (2014-07-10) --“把它交给我”
  • R Studio 版本 0.98.1087
  • Windows 7

最佳答案

strptime() 生成 POSIXlt 值,这些值在下面列出。这就是给你带来问题的原因。

df <- data.frame(
val1 = c(1, 2, NA, 4),
val2 = c("12:00", "10:30", "09:15", "05:00")
)
df$val2 <- strptime(df$val2, format="%H:%M")
is.list(df$val2)
# [1] TRUE
<小时/>

旁注:如果您使用 complete.cases() 的目的是对数据进行子集化,则 na.omit(df) 将使用 POSIXlt 值。

<小时/>

正如 @BondedDust 所指出的,如果可以的话,您应该避免在数据框中使用 POSIXlt 值。但我们可以使用 POSIXct 值,它们只是下面的整数,并且 complete.cases() 工作得很好。

再次从原来的 df 开始...

df <- data.frame(
val1 = c(1, 2, NA, 4),
val2 = c("12:00", "10:30", "09:15", "05:00")
)
df$val2 <- as.POSIXct(df$val2, format="%H:%M")
complete.cases(df)
# [1] TRUE TRUE FALSE TRUE

此外,如果您检查每个 df$val2unclass() 值,差异将变得非常明显。

关于r - 使用 POSIXlt 完成.cases 和 data.frames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27957819/

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