Как оценить знак зодиака по дате рождения в R? - PullRequest
0 голосов
/ 10 мая 2019

Итак, у меня есть вектор рождения в data.frame.На основании этой даты я хочу оценить, какой знак зодиака является респондентом.

Я видел это решение:

Проверка, находится ли дата между двумя датами в R

Но этот подход будет означать, что я долженсоздайте 12 векторов, умноженных на 2, для каждого знака зодиака (даты начала и окончания), чтобы проверить, находится ли моя дата рождения между этими двумя.Есть ли более эффективный способ сделать это?

Итак, это мой data.frame:

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 

, и я хочу получить это:

  respondent date_of_birth    zodiac
1          1    2011-12-30 Capricorn
2          2    2012-01-30  Aquarius
3          3    2012-03-01    Pisces
4          4    2012-03-30     Aries
5          5    2012-04-30    Taurus

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Это будет работать, и с полностью заполненной базой данных зодиака это должно быть довольно легко.Я имею в виду, что вам нужна база данных, в которой для каждого года у вас разные даты, потому что иначе сложно сравнивать даты в течение Нового года.Также, пожалуйста, убедитесь, что условия правильные, ничего не знайте о знаках зодиака.

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 )

)
0 голосов
/ 10 мая 2019

Я думаю * * применить функции только для этой работы.Вы можете попытаться использовать lapply для своего первого фрейма данных (точнее: с его столбцом date_of_birth) и с фреймом данных, индексирующим знаки зодиака в соответствии с датой, чтобы получить вектор zodiac, длина которого равна высоте ваших данныхкадр.

...