【问题标题】:Drop ID with all NA within a group [duplicate]删除组内所有 NA 的 ID [重复]
【发布时间】:2018-10-30 07:10:37
【问题描述】:

我使用以下代码准备了一些数据:

# # Data Preparation ----------------------
library(lubridate)
start_date <- "2018-10-30 00:00:00"
start_date <- as.POSIXct(start_date, origin="1970-01-01")
dates <- c(start_date)
for(i in 1:287) {
    dates <- c(dates, start_date + minutes(i * 10))
}
dates <- as.POSIXct(dates, origin="1970-01-01")
date_val <- format(dates, '%d-%m-%Y')

weather.forecast.data <- data.frame(dateTime = dates, date = date_val, id = 'GH1', radiation = runif(288))
weather.forecast.data$radiation[(weather.forecast.data$id == 'GH1') & (weather.forecast.data$date == '30-10-2018')] = NA

我的任务是从weather.forecast.data 中过滤掉每个唯一的 id 和 date 实例的所有辐射值都缺失的行。

我有使用data.table编写的代码:

library(data.table)
setDT(weather.forecast.data)
weather.forecast.data[, dateid := paste(date, id, sep = "__")]
weather.forecast.data[, is_all_na := all(is.na(radiation)), dateid]
weather.forecast.data = weather.forecast.data[!(is_all_na), !c('dateid', 'is_all_na'), with = FALSE]

我正在尝试使用dplyr 函数和管道操作来使其更具可读性:

library(dplyr)
weather.forecast.data %>%
  mutate(dateid = paste(date, id, sep = "__")) %>%
  group_by(dateid) %>%
  summarise(is_all_na = all(is.na(radiation))) %>%
  filter(is_all_na) %>%
  select(dateid)

我能够找回所有丢失的id。但是,我无法从原始数据中删除 id

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    不用paste列一起,可以group_by多列

    library(dplyr)
    
    weather.forecast.data %>%
       group_by(date, id) %>%
       filter(!all(is.na(radiation))) 
    

    这将删除每个dateidallradiationNA 的行。

    【讨论】:

    • 优秀。这就是我一直在寻找的。我想我在我的代码中把它复杂化了。谢谢。
    • 另外,你能帮我用代码检查一天中的早上部分(06 到 18 小时)是否丢失,从数据中删除 ID 吗?
    • @KartheekPalepu 这看起来是一个全新的问题,所以我建议您将其作为一个新问题单独提出。
    【解决方案2】:

    这里有几个使用data.table的选项:

    1) 使用.I 对原始数据集进行子集化

    setDT(weather.forecast.data)
    weather.forecast.data[
        weather.forecast.data[, .I[sum(is.na(radiation))!=.N], by=.(date, id)]$V1
    ]
    

    2) 使用反连接

    setDT(weather.forecast.data)[
        !weather.forecast.data[, all(is.na(radiation)), by=.(date, id)][(V1)],
        on=.(date, id)]
    

    输出(希望这是 OP 正在寻找的,因为没有发布示例输出):

                    dateTime       date  id  radiation
      1: 2018-10-31 00:00:00 31-10-2018 GH1 0.01794694
      2: 2018-10-31 00:10:00 31-10-2018 GH1 0.55482429
      3: 2018-10-31 00:20:00 31-10-2018 GH1 0.31422673
      4: 2018-10-31 00:30:00 31-10-2018 GH1 0.43734765
      5: 2018-10-31 00:40:00 31-10-2018 GH1 0.29053698
     ---                                              
    140: 2018-10-31 23:10:00 31-10-2018 GH1 0.56968294
    141: 2018-10-31 23:20:00 31-10-2018 GH1 0.26055891
    142: 2018-10-31 23:30:00 31-10-2018 GH1 0.15140244
    143: 2018-10-31 23:40:00 31-10-2018 GH1 0.59824054
    144: 2018-10-31 23:50:00 31-10-2018 GH1 0.55101842
    

    【讨论】:

    • 感谢您的意见。学习新东西总是好的:-)
    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2016-08-23
    • 2017-07-15
    • 1970-01-01
    相关资源
    最近更新 更多