избегая циклов на разделенных строках в r

В моей текущей переменной DATE есть такие записи, как «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]
}

person user2350622    schedule 14.01.2014    source источник
comment
Основная ошибка, которую вы допустили с точки зрения производительности, заключается не в использовании цикла как такового, а в том, что вы, кажется, увеличиваете объекты в цикле, а не заполняете предварительно выделенный. (В любом случае, это так, трудно сказать по вашему частичному коду.)   -  person joran    schedule 14.01.2014


Ответы (3)


Рассмотрим 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"
person Jilber Urbina    schedule 14.01.2014

Вы можете sapply использовать вывод из strsplit, но лучше просто использовать класс 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"

Обе эти функции векторизованы и поэтому будут быстрыми.

person James    schedule 14.01.2014

person    schedule
comment
colsplit в reshape2 является удобным расширением этого (на самом деле он просто вызывает str_split_fixed и красиво называет результаты). - person joran; 14.01.2014