我刚开始和R一起工作,请原谅我的无知。 我有两个数据集
ProjectData
,其中有20000行,其中Date
列包含日期列表HolidayData
有90行,其中Date
列包含假期列表。我需要将日期与ProjectData
和HolidayData
进行比较,如果ProjectData
中存在来自Holiday
的日期,则在IsHoliday
列中设置ProjectData
列{1}}至True
。
我认为下面的代码可行,但它从未给我正确的结果:
for (d in projectdata$cDate)
{
for (dH in HolidayDate$Date)
{
projectdata$IsHoliday <- ifelse(d==dH,TRUE,FALSE)
break
}
}
这种方法对吗?
答案 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)
这样做的好处是可以为您提供一个连接表,如果需要,可以使用
进行其他操作