【问题标题】:How to iterate through the columns of a data frame efficiently? [duplicate]如何有效地遍历数据框的列? [复制]
【发布时间】:2017-07-06 12:11:37
【问题描述】:

所以,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 行数据需要很长时间。有没有更好的方法来完成这项任务?

谢谢。

【问题讨论】:

  • 请展示一个可重现的小例子和预期的输出?
  • dplyr 包中签出separate()unite()
  • 将日期时间解析为 POSIXct 之类的日期时间类会更有用,之后您可以根据需要提取部分。
  • 建议不要玩弦乐。而是将它们转换为日期时间对象并分别提取日期和时间,如示例所示。

标签: r dataframe strsplit


【解决方案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)

【讨论】:

  • 我认为 paste0 的括号不匹配。此外,它给了我这个错误消息:“[.data.table(x, i, which = TRUE) 中的错误:当 i 是 data.table(或字符向量)时,必须使用 ' 指定要连接的列“
  • @user101998 是的,你是对的。忘了).. 修复它。如果你的数据集是data.table,则语法不同
【解决方案2】:

?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

【讨论】:

  • 由于我的格式是01/01/2016 12:39:36 AM,所以我把你的代码修改为data$pickup_date&lt;-format(as.Date(data$lpep_pickup_datetime, format="%m-%d-%y %r"),"%m-%d-%y"),结果是一堆NA。
  • 你粗心了。你的格式是%m/%d/%Y %r
猜你喜欢
  • 2018-09-02
  • 2021-06-28
  • 2022-09-24
  • 2022-01-23
  • 2020-09-11
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 2020-03-16
相关资源
最近更新 更多