如何有效地遍历数据框的列?
How to iterate through the columns of a data frame efficiently?
因此,data
是一个由许多列组成的数据框,其中一个名为 lpep_pickup_datetime
的日期和时间格式为“01/01/2016 12:39:36上午
我想按日期和时间分析这些数据,因此我尝试创建一个名为 pickup_date
的新列和一个名为 pickup_time
的包含上午或下午信息的列。
我已经使用 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 行数据花费的时间太长。有没有更好的方法来完成这个任务?
谢谢。
在base R
中,我们可以使用sub
创建一个分隔符,然后使用read.csv
创建两列
data[paste0("pickup_", c("date", "time"))] <- read.csv(text=sub("\s+",
",", data$lpep_pickup_datetime), header=FALSE, stringsAsFactors=FALSE)
?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
因此,data
是一个由许多列组成的数据框,其中一个名为 lpep_pickup_datetime
的日期和时间格式为“01/01/2016 12:39:36上午
我想按日期和时间分析这些数据,因此我尝试创建一个名为 pickup_date
的新列和一个名为 pickup_time
的包含上午或下午信息的列。
我已经使用 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 行数据花费的时间太长。有没有更好的方法来完成这个任务?
谢谢。
在base R
中,我们可以使用sub
创建一个分隔符,然后使用read.csv
创建两列
data[paste0("pickup_", c("date", "time"))] <- read.csv(text=sub("\s+",
",", data$lpep_pickup_datetime), header=FALSE, stringsAsFactors=FALSE)
?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