【问题标题】:R Dplyr and string values, how to split and get the second element? vapply/sapplyR Dplyr和字符串值,如何拆分并获取第二个元素?应用/应用
【发布时间】:2019-03-09 11:41:32
【问题描述】:

在 R 中处理这一数据框时遇到了困难。 我有两列井高和一个日期时间字符串(“yyyy-mm-dd HH:MM:ss”)。

我想从该表中提取在午夜 (00:00:00) 出现的所有行。

我可以用 python 在几秒钟内操作这个表,但我想在 R 中使用 strsplit() 而不是 POSIXct 来解决它。

如何改变表格,以便拆分日期时间字符串并将时间值提取到新列中?

我认为答案很简单,但过去几周我一直沉浸在手册中,但仍然无法弄清楚。

【问题讨论】:

  • R 是一种免费的开源编程语言和软件环境,用于统计计算、生物信息学、可视化和通用计算。 为您的问题提供最少的、可重复的、有代表性的示例。对数据使用 dput() 并使用库调用指定所有非基础包。不要为数据或代码嵌入图片,使用缩进的代码块。对于统计问题,请使用 stats.stackexchange.com。

标签: r apply lapply


【解决方案1】:

欢迎来到 SO。它可以通过多种方式完成。试试这个:

## some data
df <- data.frame(height=c(11,12),time = c("1999-9-9 00:00:00","1999-9-9 00:00:02"),stringsAsFactors = FALSE)

df
#>   height              time
#> 1     11 1999-9-9 00:00:00
#> 2     12 1999-9-9 00:00:02

## In base R

df2<- df
df2$hms <- do.call(rbind,strsplit(df2$time," "))[,2]
df2[df2$hms=="00:00:00",]
#>   height              time      hms
#> 1     11 1999-9-9 00:00:00 00:00:00

## In tidyverse

library(dplyr)
df3 <- df %>%
  mutate(hms = gsub(".*(..:..:..).*","\\1",time)) %>%
  filter(hms == "00:00:00")

df3
#>   height              time      hms
#> 1     11 1999-9-9 00:00:00 00:00:00

reprex package (v0.2.1) 于 2018 年 10 月 4 日创建

【讨论】:

  • which 在您的基本解决方案中不需要。
  • @AndreElrico 谢谢,你是对的。我测试过,没有 which 会快 2 倍。
  • 谢谢大家,基本的 R 示例是我想要得到的。 Andre 和 TC 都非常善于理解我的意思。 Gsub() 是一个使用 dplyr 的巧妙技巧,虽然我更喜欢正则表达式,所以我很欣赏 sub() 示例。
  • 乍一看,两者都可以接受正则表达式作为模式。转义字符欺骗了我。
【解决方案2】:

您没有提供示例,所以这是我的猜测:

假设您有一个字符向量(可能是一列):

dateTimes <- c("1999-01-01 11:11:11", "1999-01-01 12:12:12", "1999-01-01 13:13:13")

你把时间提取到底:

ans <- sub(".*-\\d+\\s", "", dateTimes, perl = T)
#[1] "11:11:11" "12:12:12" "13:13:13"

将它们保存到新的变量或列中:

当您想要提取出现在 00:00:00 的行时,只需使用字符串比较并对数据进行子集化:

df1[ans == "00:00:00",]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2015-11-12
    • 2021-08-06
    相关资源
    最近更新 更多