【问题标题】:Converting character string to numeric value in user defined function R在用户定义的函数R中将字符串转换为数值
【发布时间】:2018-03-17 18:36:05
【问题描述】:

我正在尝试创建一个函数,该函数将接受字符串“mm/did/yyyy”的输入,并以月、日和年的数字形式返回输出向量。我本质上想将这个新函数与下面创建的 weekday() 函数结合起来,最终返回输入字符串对应的星期几。

weekday<-function(q,r,s)
{ (if(q>= 3)
 m<-(q-2)
else
m<-(q+10))
k<-r
 c<-floor(s/100)
(if(q>=3)
y<-s%%100
else
y<-(s%%100)-1)
 f<-(floor((2.6*m)-0.2)+k+y+floor(y/4)+floor(c/4)-(2*c))%%7
if(f==0){return("Sunday")}
   else 
if(f==1){return("Monday")}
 else
 if(f==2){return("Tuesday")}
 else
 if(f==3){return("Wednesday")}
 else
  if(f==4){return("Thursday")}
 else
  if(f==5){return("Friday")}
else
  if(f==6){return("Saturday")}}

我尝试使用类似于 type.convert 的东西,但这并没有产生所需的输出。任何帮助都会非常感谢!

 dateconvert<-function("q/r/s")
  {
    type.convert(dateconvert(), na.strings = )

    weekday(convertedanswer)
    Return (weekday)


 }

【问题讨论】:

  • R 具有将字符串转换为 POSIX 或日期时间格式的功能,然后您可以从该日期时间格式获取月、工作日、日、年或时间。你为什么不使用它?
  • 奇怪的是,你的用户构建函数的复数版本包含在基础 R 中:?weekdays

标签: r


【解决方案1】:

你试过 lubridate 包吗?

input <- "12/30/2017"

# change into as.date format
inputdate <- strptime(input, "%m/%d/%Y")

library("lubridate")
day(inputdate)
# [1] 30
month(inputdate)
# [1] 12
year(inputdate)
# [1] 2017

不过,这似乎是一种迂回的方式来获取星期几。您应该尝试使用 lubridate 软件包附带的 wday()。

wday(inputdate, label=T)
# [1] Sat
# Levels: Sun < Mon < Tues < Wed < Thurs < Fri < Sat. 
# as a Ordered factor (Sunday is first)

wday(inputdate)
# [1] 7 
# wday returns the day of the week as a decimal number (01-07, Sunday is 1) or an .

【讨论】:

    【解决方案2】:

    或者不带包装:

    date = "06/10/2017"
    POSIXdate = as.POSIXlt(date, format = "%d/%m/%Y")
    strftime(POSIXdate, "%A")
    #Friday
    
    # Or if you  like one-liner
    strftime(as.POSIXlt("dd/mm/yyyy", format= "%d/%m/%Y"), "%A")
    

    【讨论】:

    • 还有weekdays in base R.
    • 有什么办法可以让创建的函数 newfunction
    • 你想输入字符d &lt;- "10/06/17"并输出字符向量c("10" , "06", "17")吗?如果是这样:strsplit("10/06/17", "/")[[1]].
    【解决方案3】:

    lubridate 包非常适合这个!您可以使用lubridate::mdy() 将日期转换为您提到的“mm/dd/yyyy”格式,然后使用lubridate::week() 获得星期。

    lubridate::week(lubridate::mdy("10/05/2017"))
    #> 5
    

    如果你想要一天本身,而不是数字输出,你可以使用

    lubridate::wday(lubridate::mdy("10/05/2017"),
                    label = TRUE)
    #> [1] Thurs
    

    【讨论】:

      猜你喜欢
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 2013-05-23
      • 1970-01-01
      相关资源
      最近更新 更多