如何从R中的因子向量中的每个字符串中提取字符串的一段

  • 本文关键字:字符串 提取 一段 向量
  • 更新时间 :
  • 英文 :


我有一个包含时间戳的列(目前被归类为因子),我想从中提取。大约有220,000行,其中大约一半包含"%d %m"这样的因子。%Y %H:%M:%S",另一半是"%d.% M"。% Y % H: % M"。所以大约一半的人比另一半多出三张。

我想从每一行中提取%d %m。%Y %H:%M",从包含它的文件中去掉:%S。

由于它们被归类为因子,我的假设是它们可以按顺序提取,即提取第1 - 14个字符。

这就是数据的样子。

Start.Timestamp
01.01.2015 12:32
01.01.2015 08:22
01.01.2015 14:10
31.12.2014 21:43
01.01.2015 00:21
01.01.2015 12:38
01.01.2015 01:00
01.01.2015 14:13
01.01.2016 04:11:34
01.01.2016 10:13:30
01.01.2016 04:30:08
01.01.2016 08:49:40
01.01.2016 07:44:45

同样,对于那些缺少"%S"的字符串,所有的":00"都是可以接受的。

我希望这是清楚的。

提前感谢大家

根据您的初始数据,例如:

lapply(df,substring, first=1, last=16)

也许能帮上忙。

当你的数据是这样的:

df <- data.frame("Start.Timestamp",
             "01.01.2015 12:32",
             "01.01.2015 08:22",
             "01.01.2015 14:10",
             "31.12.2014 21:43",
             "01.01.2015 00:21",
             "01.01.2015 12:38",
             "01.01.2015 01:00",
             "01.01.2015 14:13",
             "01.01.2016 04:11:34",
             "01.01.2016 10:13:30",
             "01.01.2016 04:30:08",
             "01.01.2016 08:49:40",
             "01.01.2016 07:44:45")
lapply(df,substring, first=1, last=16)
#$X.Start.Timestamp.
#[1] "Start.Timestamp"
#$X.01.01.2015.12.32.
#[1] "01.01.2015 12:32"
#$X.01.01.2015.08.22.
#[1] "01.01.2015 08:22"
#$X.01.01.2015.14.10.
#[1] "01.01.2015 14:10"
#$X.31.12.2014.21.43.
#[1] "31.12.2014 21:43"
...

或任何其他应用函数,因为我不知道你的整个数据是如何设置的。

我们可以使用润滑脂的dmy_hms()函数和选项truncated = 1来生成POSIXct对象。当时间数据有不完整的条目时,这个选项很有用,比如在本例中缺少秒数(然后将其设置为00)。

然后将dmy_hms()的输出包裹到format()中,得到所需的形式:

format(lubridate::dmy_hms(df1$Start.Timestamp, truncated = 1),"%d.%m.%Y %H:%M")
# [1] "01.01.2015 12:32" "01.01.2015 08:22" "01.01.2015 14:10" "31.12.2014 21:43"
# [5] "01.01.2015 00:21" "01.01.2015 12:38" "01.01.2015 01:00" "01.01.2015 14:13"
# [9] "01.01.2016 04:11" "01.01.2016 10:13" "01.01.2016 04:30" "01.01.2016 08:49"
#[13] "01.01.2016 07:44"

df1 <- structure(list(Start.Timestamp = structure(c(4L, 3L, 6L, 13L, 
1L, 5L, 2L, 7L, 8L, 12L, 9L, 11L, 10L), .Label = c("01.01.2015 00:21", 
"01.01.2015 01:00", "01.01.2015 08:22", "01.01.2015 12:32", "01.01.2015 12:38", 
"01.01.2015 14:10", "01.01.2015 14:13", "01.01.2016 04:11:34", 
"01.01.2016 04:30:08", "01.01.2016 07:44:45", "01.01.2016 08:49:40", 
"01.01.2016 10:13:30", "31.12.2014 21:43"), class = "factor")), 
.Names = "Start.Timestamp", class = "data.frame", row.names = c(NA, -13L))

假设您有一个因子列,我建议将其转换为字符向量,并使用strptime()strftime()以获得日期时间格式的所需输出:

你在data.frame中的向量

your_df <- structure(list(Start.Timestamp = structure(c(4L, 3L, 6L, 13L, 
1L, 5L, 2L, 7L, 8L, 12L, 9L, 11L, 10L), .Label = c("01.01.2015 00:21", 
"01.01.2015 01:00", "01.01.2015 08:22", "01.01.2015 12:32", "01.01.2015 12:38", 
"01.01.2015 14:10", "01.01.2015 14:13", "01.01.2016 04:11:34", 
"01.01.2016 04:30:08", "01.01.2016 07:44:45", "01.01.2016 08:49:40", 
"01.01.2016 10:13:30", "31.12.2014 21:43"), class = "factor")), .Names = "Start.Timestamp", class = "data.frame", row.names = c(NA, 
-13L))

得到你想要的输出:

strftime(strptime(as.character(your_df$Start.Timestamp), format = "%d.%m.%Y %H:%M"), "%d.%m.%Y %H:%M")

输出
 [1] "01.01.2015 12:32" "01.01.2015 08:22" "01.01.2015 14:10" "31.12.2014 21:43" "01.01.2015 00:21"
 [6] "01.01.2015 12:38" "01.01.2015 01:00" "01.01.2015 14:13" "01.01.2016 04:11" "01.01.2016 10:13"
[11] "01.01.2016 04:30" "01.01.2016 08:49" "01.01.2016 07:44"

这取决于给定的格式(输出您的数据样本)。一种可能是

> str <- c("01.01.2016 07:44", "01.01.2016 07:45")
> substr(str, 1,16)
[1] "01.01.2016 07:44" "01.01.2016 07:45"

最新更新