声明:编写一个函数,接受日期作为输入并返回与该日期对应的黄道十二宫的星座(使用Lubridate
包)。
问题:当我输入“12 月 22 日”和“1 月 19 日”之间的任何日期时。它返回NULL
。
ymd
应返回 2017-12-22 UTC--2018-01-19 UTC
而不是 2017-12-22 UTC--2017-01-19 UTC
。
是否有更好的方法来生成 Date
/POSIx
数据的间隔?
zodiac_sign <- function(input){
library(lubridate)
input <- ymd(as.character(as.Date(input,format="%B %d")))
x <- as.Date(c("March 21","April 19","April 20","May 20","May 21","June 20","June 21","July 22","July 23","August 22","August 23","September 22","September 23","October 22","October 23","November 21","November 22","December 21","December 22","January 19","January 20","February 18","February 19","March 20"),format="%B %d")
x_dateform_char <- as.character(x)
lst <- list()
for(i in seq(1,length(x_dateform_char),2)) {
lst[[i]] <- c(ymd(x_dateform_char[i]) %--% ymd(x_dateform_char[i+1]))
if(i==(length(x_dateform_char)-1)){
break
}
}
lst <- lst[!sapply(lst, is.null)]
names(lst) <-
c("Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittari
us","Capricorn","Aquarius","Pisces")
lst
for(i in 1:length(lst)){
if(input %within% lst[[i]]){
sign <- names(lst)[i]
} }
sign
}
最佳答案
星座通常取决于日期,月份和年份没有任何作用。因此我想尝试一下完全忽略评估逻辑中的年份部分。
我考虑的逻辑是基于日期(一个月的天
)来划分该月的星座。然后只需从输入值中显式考虑月
和日
部分即可。
zodiac_sign <- function(input){
library(lubridate)
input <- ymd(as.character(as.Date(input,format="%B %d")))
# Define data.frame for zodiac_sign
zodiac_sign_df <- data.frame(Month = c("March", "April", "May", "June", "July", "August", "September", "October", "November", "December", "January", "February"),
Zodiac_Separation_Dt = c(21, 20, 21, 21, 23, 23, 23, 23, 22, 22, 20, 19),
LowerSideZS = c("Pisces", "Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius"),
UpperSideZS = c("Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra","Scorpio","Sagittarius","Capricorn","Aquarius", "Pisces"),
stringsAsFactors = FALSE )
# Filter data with matching month
val_df <- zodiac_sign_df[zodiac_sign_df$Month == months(input), ]
zodiac_sign <- ifelse( day(input) >= val_df$Zodiac_Separation_Dt, val_df$UpperSideZS, val_df$LowerSideZS)
zodiac_sign
}
上述逻辑中使用的 zodiac_sign_df
如下所示:
> zodiac_sign_df
Month Zodiac_Separation_Dt LowerSideZS UpperSideZS
1 March 21 Pisces Aries
2 April 20 Aries Taurus
3 May 21 Taurus Gemini
4 June 21 Gemini Cancer
5 July 23 Cancer Leo
6 August 23 Leo Virgo
7 September 23 Virgo Libra
8 October 23 Libra Scorpio
9 November 22 Scorpio Sagittarius
10 December 22 Sagittarius Capricorn
11 January 20 Capricorn Aquarius
12 February 19 Aquarius Pisces
关于r - 使用 "lubridate"包编写 R 函数,该函数接受日期(例如 ."August 14")并返回十二生肖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48026462/