Така, 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 реда данни. Има ли по-добър начин за изпълнение на тази задача?
Благодаря.
Отговори:
1 за отговор № 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
1 за отговор № 2
в base R
, можем да използваме sub
за да създадете разделител и след това с read.csv
създайте две колони
data[paste0("pickup_", c("date", "time"))] <- read.csv(text=sub("\s+",
",", data$lpep_pickup_datetime), header=FALSE, stringsAsFactors=FALSE)