r语言 - 从 SQL 查询中排除 NULL 值,并在数据帧中保留旧值



我想动态执行SQL查询(例如每天(并将数据存储到Shiny应用程序中的反应式数据帧中。但是,如果返回的查询包含 NULL 值或零,我想保留旧值,而不是将其替换为最新查询的 NULL 或 0。

例如:

初始数据帧:

date       a b c d
2019-01-01 1 2 3 4
2019-01-02 2 3 4 5

存储为数据帧的返回查询:

date       a    b c d
2019-01-03 NA 4 3 0

使用 dplyr bind_rows返回 SQL 查询并将其绑定到数据帧后,最终数据帧应如下所示:

date       a b c d
2019-01-01 1 2 3 4
2019-01-02 2 3 4 5
2019-01-03 2 4 3 5   # 2 retained instead of NULL, 5 retained instead of 0

我知道我可能必须编写一个条件语句,如以下伪代码:

if (is.null(returned_query) & (returned_query != 0)) {
   // some code to replace value with the most recent value
} else {
  // proceed with bind_rows()
} 
不幸的是,我

无法控制SQL查询,我必须在R中执行此操作。

您可以使用"which"来标识所需条件 NULL/NA/0 的索引。

您可以在 ?哪个

因此,对于您的问题,解决方案可能是:

设置测试数据


DT_old <- data.frame(date=c("2019-01-01","2019-01-02"),a=1:2,b=2:3,c=3:4,d=4:5, stringsAsFactors = FALSE)
# New Data from SQL query
DT_new <- data.frame(date="2019-01-03",a=0,b=2,c=3,d=4, stringsAsFactors = FALSE)

将新数据绑定到旧数据

DT3 <- rbind(DT_old, DT_new) # or use your dplyr logic to row bind old and new datasets

计算条件的索引,并在绑定数据集中使用 prev 行替换

# find out indices of the bound dataframe which meet your criteria
n_idx <- which((DT3 ==0)|is.na(DT3)|is.null(DT3), arr.ind=TRUE)
# substitute said indices with values from previous row
DT3[nrow(DT3),n_idx[,2]] <- DT3[nrow(DT3)-1,n_idx[,2]]

请注意,这假设每个查询只添加一行。

最新更新