2017-12-29 45 views
2

文:日付を入力として受け取り、その日付に対応する十二支の占星術記号を返す関数を書く(Lubridateパッケージを使用してください)。日付(例えば「8月14日」)をとり、星座を返す「lubridate」パッケージを使ってR関数を書く

問題:「12月22日」から「1月19日」の間に日付を入力したとき。それはNULLを返します。 ymdは、2017-12-22 UTC--2017-01-19 UTCの代わりに2017-12-22 UTC--2018-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 
} 

答えて

2

干支は、典型的には、任意の役割を果たしていないヶ月と年の日付に依存必要な結果を生成するようにコードを再edittedています。それで、評価ロジックから一年分を完全に無視しようと考えました。

私が考えている論理は、その月の星座を分ける日付(day月)に基づいています。次に、入力値から明示的にmonthday部分を考慮してください。上記のロジックで使用

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次のようになります。おそらく、うるう年に(例えば2016)の計算を強制したいと思う

> 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 
1

私はあなたが

zodiac_sign <- function(input){ 
    nms<- input 
    library(lubridate) 

    input <-ymd(as.character(as.Date(input,format="%B %d"))) 

    x <- as.Date(c("January 20","February 18", 
       "February 19","March 20","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"),format="%B %d") 
    zodiac_name<-c("Aquarius","Pisces","Aries","Taurus","Gemini","Cancer","Leo","Virgo","Libra", 
       "Scorpio","Sagittarius","Capricorn") 

    lst=lapply(split(x,rep(1:12,each=2)),function(y){if(y[2]<y[1])y[2]=y[2]+365;c(y[1]%--%y[2])}) 
    limit=format(ymd(as.character(as.Date("Jan 20",format="%B %d"))),format="%m-%d") 
    lower=format(input,format="%m-%d")<limit 
    input[lower]=input[lower]+365 


    result=which(mapply(`%within%`,list(input),lst),T) 
    if(is.matrix(result))setNames(zodiac_name[result[order(result[,1]),2]],nms) 
    else setNames(zodiac_name[result],nms) 
} 
zodiac_sign(c("Jan 10","Mar 20", "Aug 30", "Sep 25","Dec 22","Dec 25")) 
    Jan 10  Mar 20  Aug 30  Sep 25  Dec 22  Dec 25 
"Capricorn" "Pisces"  "Virgo"  "Libra" "Capricorn" "Capricorn" 
+0

代わりに、現在のyear--のそれ以外の場合は「2月29日"問題になります: – Angelo

+0

よく、私は後でそれを調べなければならないと思います – Onyambu

+0

@Onyambu私は'うるう年 'が問題にならないはずの別のソリューションを追加しようとしました。 – MKR

関連する問題