【问题标题】:R Function to Populate Data Frame Based on Conditions in Separate Data FrameR函数根据单独数据框中的条件填充数据框
【发布时间】:2021-11-19 23:27:58
【问题描述】:

我有一个如下所示的空白数据框“DF1”:

Site 2021-01-01 00:00:00 2021-01-01 03:00:00 2021-01-01 06:00:00 2021-01-01 09:00:00
BMA NA NA NA NA
BMC NA NA NA NA
MCA NA NA NA NA
MCC NA NA NA NA

我有一个部分数据框“DF2”,如下所示:

ImageDate SiteName
2021-01-01 02:53:00 BMA
2021-01-01 08:44:00 MCC
2021-01-01 05:22:00 BMC

如何查询 DF2,以便当“ImageDate”中的数据点落入 DF1 的列标题(时隙)之一时,将数字“1”放置在 DF1 的相应/匹配“站点”中?如果在某个站点的特定列(时间段)中没有找到数据,则该单元格将获得“0”,因此它将产生以下数据框:

Site 2021-01-01 00:00:00 2021-01-01 03:00:00 2021-01-01 06:00:00 2021-01-01 09:00:00
BMA 1 0 0 0
BMC 0 1 0 0
MCA 0 0 0 0
MCC 0 0 1 0

谢谢!

【问题讨论】:

    标签: r dataframe subset


    【解决方案1】:

    您可以将df2 转换成我们想要的结构,而不是创建一个空白的df1 并填充它。

    你可以试试-

    library(dplyr)
    library(tidyr)
    library(lubridate)
    
    df2 %>%
      mutate(ImageDate = floor_date(ymd_hms(ImageDate), '3 hours')) %>%
      pivot_wider(names_from = ImageDate, values_from = ImageDate, 
                  values_fn = length,values_fill = 0)
    

    【讨论】:

    • 这主要基于我发布的问题。但是,与我的实际数据集相比,该示例要少得多。在实际数据集中,我的“DF1”运行 83 列连续数据/时隙,其中一些不会从“DF2”获取数据,但仍然同样重要。如果有办法同时使用 DF1 和 DF2,那对我正在尝试做的事情会更好。
    • 您可以在mutate 之后和pivot_wider 步骤之前添加一个complete 步骤以包含丢失的时间。例如,如果您想包含从 2021 年 1 月 1 日到 2021 年 2 月 1 日的所有 3 小时间隔,您可以执行 mutate (...) %>% complete(ImageDate = seq(ymd_hms('2021-01-01 0:0:0'), ymd_hms('2021-02-01 0:0:0'), by = '3 hours')) %>% pivot_wider(....)
    • 您先生是圣人。这很好用。我请你喝咖啡。
    猜你喜欢
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 2016-02-14
    • 2017-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多