【问题标题】:avoiding loops on split strings in r避免在 r 中拆分字符串上的循环
【发布时间】:2014-01-14 16:28:00
【问题描述】:

我当前的 DATE 变量包含“Wednesday 01/01/86”之类的条目 我试图将日期与日期分开并将它们分别放入两个变量中。 我当前的代码可以工作,但它有循环,在处理大数据时可能效率不高。有什么改进的想法吗?

result$DATE <- as.character(result$DATE) ## cast DATE into character

new_DATE <- strsplit(result$DATE, " ") ## split days from dates

## store days and dates separately into two new variables
for(i in 1:length(result$DATE)) {
result$GAMEDATE[i] <- new_DATE[[i]][2]
result$GAMEDOW[i] <- new_DATE[[i]][1]
}

【问题讨论】:

  • 您在性能方面犯的主要错误并不是使用循环本身,而是您似乎在循环中增加对象,而不是填充预先分配的对象。 (无论如何,很难从您的部分代码中分辨出来。)

标签: r loops for-loop apply performance


【解决方案1】:

考虑strsplit

> dates <- c("Wednesday 01/01/86", "Thursday 02/01/86", "Friday 03/01/86")
> do.call(rbind, strsplit(dates, " ") )
     [,1]        [,2]      
[1,] "Wednesday" "01/01/86"
[2,] "Thursday"  "02/01/86"
[3,] "Friday"    "03/01/86"

【讨论】:

    【解决方案2】:
    > library(stringr)
    > str_split_fixed("Wednesday 01/01/86",' ',2)
         [,1]        [,2]      
    [1,] "Wednesday" "01/01/86"
    

    【讨论】:

    • colsplit in reshape2 是一个方便的扩展(它实际上只是调用 str_split_fixed 并很好地命名结果)。
    【解决方案3】:

    您可以通过strsplit 的输出来sapply,但最好只使用 Date 类:

    (x <- as.Date(c("Wednesday 01/01/86","Friday 03/01/86"), "%A %d/%m/%y"))
    [1] "1986-01-01" "1986-01-03"
    

    然后您可以根据需要格式化:

    format(x,"%d/%m/%Y")
    [1] "01/01/1986" "03/01/1986"
    

    这两个函数都是矢量化的,因此速度很快。

    【讨论】:

      猜你喜欢
      • 2020-07-06
      • 2011-03-20
      • 2016-10-20
      • 2014-09-19
      • 2018-11-17
      • 2019-08-24
      • 1970-01-01
      相关资源
      最近更新 更多