带有POSIXlt的complete.cases和data.frames

时间:2015-01-15 06:23:09

标签: r

我主要是一名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值,对应NA中的df$val1值。


我遇到的问题是,在通过POSIXlt将字符向量转换为strptime向量后,由于以下错误,complete.cases不再有效:

Error in complete.cases(df) : not all arguments have the same length

例如:

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的长度仍然相同。我在这里错过了什么吗?在使用complete.cases转换时间字符串后,为什么strptime会停止工作?

我确定我可以解决这个特定问题(我不 为什么strptime不适合我。


系统信息:

  • R版本3.1.1(2014-07-10) - &#34;把它塞进我&#34;
  • R Studio版本0.98.1087
  • Windows 7

1 个答案:

答案 0 :(得分:3)

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

此外,如果您检查每个unclass()的{​​{1}}值,差异将变得非常明显。