【发布时间】:2023-04-05 00:17:01
【问题描述】:
可重现的数据集:
library(data.table)
library(dplyr)
library(zoo)
df = expand.grid(ID = sample(LETTERS[1:5]),
Date = seq.Date(as.Date("2012-01-01"), as.Date("2012-12-01"), by = "1 month"))
df = df[order(as.character(df$ID)),]
df = data.table(df, V1 = runif(nrow(df),0,1), V2 = runif(nrow(df),0,1), V3 = runif(nrow(df),0,1))
ind = sample(nrow(df), nrow(df)*.5)
na.gen <- function(x, ind){x[ind] <- NA}
df1 <- df %>% slice(., ind) %>% mutate_each(funs(na.gen), starts_with("V"))
df2 = df[!ind]
df <- rbind(df1, df2)
df <- df[order(as.character(df$ID), df$Date),]
df$ID = as.character(df$ID)
在上述数据集中,我的想法是使用 Last Observation Carried Forward 方法估算数据。我最初的问题是一个非常大的数据集,所以我测试了dplyr 和data.table 解决方案。
final_dplyr <- df %>% group_by(ID) %>% mutate_each(funs(na.locf), starts_with("V"))
final_data.table <- df[, na.locf(.SD), by = ID]
data.table 给了我正确的解决方案,但是,dplyr 弄乱了从 NA 开始的子集。我使用dplyr 收到以下警告:
Warning messages:
1: In `[.data.table`(`_dt`, , `:=`(V1, na.locf(V1)), by = `_vars`) :
Supplied 11 items to be assigned to group 1 of size 12 in column 'V1' (recycled leaving remainder of 1 items).
有人能帮我理解dplyr 做错了什么吗?
【问题讨论】:
-
您写这些的方式非常不同。 na.locf(.SD) 对数据集进行操作,而 mutate_each 对每一列独立操作...
-
但是,据我所知,
na.locf应该对列向量或数据框执行相同的插补。我最初为我的问题编写了dplyr版本,但是当它不起作用时,我不得不编写data.table版本,这让我感到惊讶。现在我不清楚,为什么一个有效,而另一个无效。
标签: r data.table dplyr