所以我在data.frame中有一个出生日期向量。我想根据这个日期评估哪个星座是被访者。
我已经看到了以下解决方案:
Checking if Date is Between two Dates in R
但是,这种方法意味着我必须为每个星座(开始日期和结束日期)创建12个矢量乘以2,以检查我的出生日期是否介于两者之间。有更有效的方法吗?
这是我的data.frame:
set_item_property('A.PB',DISPLAYED,property_true);
data.frame(respondent = c(1,2,3,4,5), date_of_birth = seq(as.Date("2011-12-30"), as.Date("2012-04-30"), by="months") )
我想得到这个:
respondent date_of_birth
1 1 2011-12-30
2 2 2012-01-30
3 3 2012-03-01
4 4 2012-03-30
5 5 2012-04-30
答案 0 :(得分:0)
我认为* apply函数仅用于这项工作。您可以尝试在fisrt数据帧上使用lapply(更确切地说:使用其date_of_birth
列),并根据日期将数据框编入黄道十二宫,以产生向量zodiac
,其长度等于数据框的高度。
答案 1 :(得分:0)
这将起作用,并且使用完全填充的十二生肖数据库,这应该非常容易。我的意思是,您需要一个数据库,每年在其中都有不同的日期,因为否则很难比较新年的日期。另外,请确保条件正确,对生肖一无所知。
library(fuzzyjoin)
birth.days <- data.frame(respondent = c(1,2,3,4,5), date_of_birth = seq(as.Date("2011-12-30"), as.Date("2012-04-30"), by="months") )
zodiacs <- data.frame(Zodiac = c("Capricorn")
, Start.Date = as.Date("2011-12-22")
, End.Date = as.Date("2012-01-20"))
fuzzy_left_join(birth.days, zodiacs,
by = c("date_of_birth" = "Start.Date", "date_of_birth" = "End.Date"),
match_fun = list(`>=`, `<`))
respondent date_of_birth Zodiac Start.Date End.Date 1 1 2011-12-30 Capricorn 2011-12-22 2012-01-20 2 2 2012-01-30 <NA> <NA> <NA> 3 3 2012-03-01 <NA> <NA> <NA> 4 4 2012-03-30 <NA> <NA> <NA> 5 5 2012-04-30 <NA> <NA> <NA>
仅以如何使用日期填充数据库为例:
Capricorn <- data.frame( Start.Date = seq.Date(from= as.Date("1900-12-22"), to = as.Date("2100-01-01"), by = "year")
, End.Date = seq.Date(from= as.Date("1901-01-20"), to = as.Date("2100-01-20"), by = "year")
, Zodiac = rep("Capricorn", 200 )
)