使用 zoo 包函数 na.locf 填充值时维护数据 class
Maintaining data class when using zoo package function na.locf to fill values
我正在使用 zoo 包用以前的数据填充 NA 值。这很好用,除了生成的填充数据框似乎被强制转换为日期和数字中的字符。
我的问题:有没有办法保持原始数据class而不是将数据强制转换为字符?
我的可重现示例(我如何接收数据的简化版本):
# 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) 及其变体分别在每一列上执行 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 的 %>%:
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
我正在使用 zoo 包用以前的数据填充 NA 值。这很好用,除了生成的填充数据框似乎被强制转换为日期和数字中的字符。
我的问题:有没有办法保持原始数据class而不是将数据强制转换为字符?
我的可重现示例(我如何接收数据的简化版本):
# 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) 及其变体分别在每一列上执行 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 的 %>%:
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