complete.cases 和 data.frames 与 POSIXlt
complete.cases and data.frames with POSIXlt
我主要是一名 Python 程序员,但仍在学习 R。我遇到问题的数据可用 here,但我已经举了一个问题的小例子, 下面。
R 的 complete.cases()
函数应该 return 一个逻辑向量,指示测试对象的哪些行不包含 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
不再有效,原因如下错误:
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$val1
和df$val2
的长度还是一样的。我在这里错过了什么吗?为什么我用 strptime
转换时间字符串后 complete.cases
会停止工作?
我确定我可以解决这个特定问题(我 真的 不需要通过 strptime
转换的数据),我只是好奇为什么complete.cases
对我不起作用。
系统信息:
- R 版本 3.1.1 (2014-07-10) -- "Sock it to Me"
- 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$val2
的 unclass()
值,差异将变得非常明显。
我主要是一名 Python 程序员,但仍在学习 R。我遇到问题的数据可用 here,但我已经举了一个问题的小例子, 下面。
R 的 complete.cases()
函数应该 return 一个逻辑向量,指示测试对象的哪些行不包含 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
不再有效,原因如下错误:
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$val1
和df$val2
的长度还是一样的。我在这里错过了什么吗?为什么我用 strptime
转换时间字符串后 complete.cases
会停止工作?
我确定我可以解决这个特定问题(我 真的 不需要通过 strptime
转换的数据),我只是好奇为什么complete.cases
对我不起作用。
系统信息:
- R 版本 3.1.1 (2014-07-10) -- "Sock it to Me"
- 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$val2
的 unclass()
值,差异将变得非常明显。