在R中,如何比较不同大小的数据帧列

时间:2015-09-25 01:24:40

标签: r date

我刚开始和R一起工作,请原谅我的无知。 我有两个数据集

  1. ProjectData,其中有20000行,其中Date列包含日期列表
  2. HolidayData有90行,其中Date列包含假期列表。
  3. 我需要将日期与ProjectDataHolidayData进行比较,如果ProjectData中存在来自Holiday的日期,则在IsHoliday列中设置ProjectData列{1}}至True

    我认为下面的代码可行,但它从未给我正确的结果:

    for (d in projectdata$cDate)
    {
      for (dH in HolidayDate$Date)
      {
        projectdata$IsHoliday <- ifelse(d==dH,TRUE,FALSE)
        break
      }
    }
    

    这种方法对吗?

2 个答案:

答案 0 :(得分:2)

尝试:

projectdata$IsHoliday <- projectdata$cDate %in% HolidayDate$Date

您的代码存在一些问题。

首先,循环迭代有点奇怪。您正在遍历projectdata$cDate的每个HolidayDate$Date元素,并将projectdata$IsHoliday设置为TRUE或FALSE。问题是你没有说哪个元素是TRUE或FALSE,所以你每次都将while列设置为true或false。您可能最终得到一个全部为TRUE或全部为FALSE的列。 break也是不必要的。

其次,一般来说,优良的做法是避免循环有利于R中的向量化。许多R函数被向量化 - 我们可以在向量(即数字序列)上调用它们并获得合理的输出。在这种情况下,%in%要比==好得多,因为==会逐一进行比较,而%in%则会搜索一个。

答案 1 :(得分:-1)

另一个解决方案是

library(dplyr)

result =
  HolidayData %>%
  mutate(IsHoliday = TRUE) %>%
  right_join(Project_Data) %>%
  mutate(IsHoliday = IsHoliday %in% TRUE)

这样做的好处是可以为您提供一个连接表,如果需要,可以使用

进行其他操作