/ / Як ефективно перебирати стовпці фрейму даних? [дублікат] - r, фрейм даних, strsplit

Як ефективно ітерації по стовпцям кадру даних ефективно? [дублікат] - r, кадр даних, strsplit

Так, data - це кадр даних, що складається з багатьох стовпців, і один з яких викликається lpep_pickup_datetime має дату та час у форматі "01.01.2016 00:39:36"

Я хочу проаналізувати ці дані за датою та часом, тому намагаюся створити новий стовпець з назвою 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)