2017-02-17 15 views
-4

Так, data является кадр данных состоит из множества столбцов, и один из которых называется lpep_pickup_datetime имеет дату и время в формате «01/01/2016 12:39:36 AM»Как эффективно перебирать столбцы кадра данных?

Я хочу, чтобы проанализировать эти данные по дате и времени, поэтому я пытаюсь создать новый столбец с именем pickup_date и один по имени pickup_time с информацией AM или PM.

Я использовал функцию strsplit, чтобы разбить строку на следующую форму: c ("01/01/2016", "12:29:24", "AM"), и я пытаюсь создать вышеупомянутое столбцы из этих данных.

Я написал следующий код:

data$lpep_pickup_datetime=strsplit(data$lpep_pickup_datetime, " ") 

data$pickup_date=data$lpep_pickup_datetime[[1]][1] 


for (i in seq(1,90181)) 
{ 
    data$pickup_time[i]=data$lpep_pickup_datetime[[i]][2] 
} 

Это серьезно неэффективно, так как это занимает слишком много времени, чтобы перебирать 90181 строк данных. Есть ли лучший способ выполнить эту задачу?

Спасибо.

+0

Пожалуйста, покажите небольшой воспроизводимый пример и ожидаемый результат? – akrun

+0

checkout 'separate()' и 'unite()' из 'dplyr' пакета. – Aramis7d

+1

Было бы гораздо более полезно разобрать datetime на класс datetime, такой как POSIXct, после чего вы можете извлечь детали, если вам действительно нужно. – alistaire

ответ

1

?apply(df, 2, function(...)) является обычным способом переборе колонн. Но вам не нужно это делать здесь

> df<-data.frame("datetime" = format(seq(c(ISOdate(2000,3,20)), by = "day", length.out = 100000), "%Y-%m-%d %r"), stringsAsFactors=FALSE) 
> str(df) 
'data.frame': 100000 obs. of 1 variable: 
$ datetime: chr "2000-03-20 08:00:00 PM" "2000-03-21 08:00:00 PM" "2000-03-22 08:00:00 PM" "2000-03-23 08:00:00 PM" ... 
> df$dateonly<-format(as.Date(df$datetime, format="%Y-%m-%d %r"),"%Y-%m-%d") 
> head(df) 
       datetime dateonly 
1 2000-03-20 08:00:00 PM 2000-03-20 
2 2000-03-21 08:00:00 PM 2000-03-21 
3 2000-03-22 08:00:00 PM 2000-03-22 
4 2000-03-23 08:00:00 PM 2000-03-23 
5 2000-03-24 08:00:00 PM 2000-03-24 
6 2000-03-25 08:00:00 PM 2000-03-25 
+0

Так как мой формат имеет форму '01/01/2016 12:39:36 AM', я изменил ваш код на' data $ pickup_date <-format (as .Date (данные $ lpep_pickup_datetime, format = "% m-% d-% y% r"), "% m-% d-% y") ', но результатом является куча NA. – user101998

+0

Вы были небрежны. Ваш формат будет '% m /% d /% Y% r'. – Jean

1

В base R, мы можем использовать sub создать разделитель, а затем с read.csv создать две колонки

data[paste0("pickup_", c("date", "time"))] <- read.csv(text=sub("\\s+", 
     ",", data$lpep_pickup_datetime), header=FALSE, stringsAsFactors=FALSE) 
+0

Я думаю, что для paste0 существует несогласованная скобка. Кроме того, он дает мне это сообщение об ошибке: «Ошибка в'. .data.table' (x, i, which = TRUE): Когда i является таблицей данных (или символьным вектором), столбцы для объединения должны указывается либо с использованием аргумента «on =» (см. «data.table»), либо путем ввода x (то есть отсортированного и отмеченного как отсортированного, см. «setkey»). Соединения с ключами могут иметь дополнительные преимущества скорости при очень больших данных из-за того, что x является в ОЗУ. – user101998

+0

@ user101998 Да, вы правы. Забыл о ')' .. Исправлено. Если ваш набор данных «data.table», синтаксис отличается от – akrun