使用zoo包函数na.locf填充值时维护数据类

时间:2017-07-06 17:11:06

标签: r zoo

我正在使用zoo包来填充先前数据的NA值。这很有效,除了生成的填充数据框似乎被强制转换为日期和数字中的字符。

我的问题:有没有办法维护原始数据类,而不是将数据强制转换为字符?

我可重复的示例(我收到数据的简化版本):

# Packages
library(dplyr)
library(zoo)

# Data
mydates <- as.Date(c("2017-06-28", "2017-06-29", "2017-06-30", "2017-07-01", "2017-07-02", "2017-07-03", "2017-07-04", "2017-07-05"))
item_1  <- c(180.6692, 180.6755, 180.6823, NA, NA, 180.7014, 180.7081, NA)
item_2  <- c(1295.1, 1293.019, 1290.876, NA, NA, 1288.256, NA, NA)
item_3 <-  c(1693.05, 1686.481, 1681.491, NA, NA, 1675.35, NA, NA)

# Data frame
df <- data.frame(mydates, item_1, item_2, item_3)

# Fill NAs with previous value
df_fill <- df %>%
  na.locf()

# Correct data class
str(df)

# Incorrect data class from filling NA values
str(df_fill)

1 个答案:

答案 0 :(得分:0)

以下是一些替代解决方案。 (1)及其变体分别对每列执行na.locf,而(2)及其变体将数据框转换为动物园,应用na.locf并转换回来。 (如果您知道任何列中没有前导NA,那么在这些解决方案中可以选择省略na.rm = FALSE。)

1)分别对每列执行na.locf。只需动物园。它会修改df。所有其他解决方案都可以在不修改输入的情况下提供输出答案。

df[] <- lapply(df, na.locf, na.rm = FALSE)

1a)类似,但不会修改df

replace(df, TRUE, lapply(df, na.locf, na.rm = FALSE))

1b)类似但使用来自magrittr或dplyr的%&gt;%:

df %>% replace(., TRUE, lapply(., na.locf, na.rm = FALSE))

2)转换为动物园,应用na.locf并转换回数据框。只需动物园。

fortify.zoo(na.locf(read.zoo(df), na.rm = FALSE))

2a)类似但使用magrittr或dplyr

df %>% read.zoo %>% na.locf(na.rm = FALSE) %>% fortify.zoo