如何从R的因子向量中的每个字符串中提取字符串的部分?

如何从R的因子向量中的每个字符串中提取字符串的部分?,r,R,我有一个带有时间戳的专栏(目前被归类为因素),我想从中摘录。大约有220000行,其中大约一半包含因子“%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

我有一个带有时间戳的专栏(目前被归类为因素),我想从中摘录。大约有220000行,其中大约一半包含因子“%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"

...

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

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"

...

df鉴于您有一个factor列,我建议将其转换为字符向量,并使用
strtime()
strftime()
以日期时间格式获得所需的输出:

数据帧中的向量 输出
鉴于您有一个factor列,我建议将其转换为字符向量,并使用
strtime()
strftime()
以日期时间格式获得所需的输出:

数据帧中的向量 输出
这取决于给定的格式(dput数据样本)

> 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"
str子序列(str,1,16) [1] "01.01.2016 07:44" "01.01.2016 07:45"

如果截断是可以的。

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

> 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"
str子序列(str,1,16) [1] "01.01.2016 07:44" "01.01.2016 07:45"

如果截断是可以的。

我们可以使用lubridate的
dmy_hms()
函数和选项
truncated=1
来生成POSIXct对象。当时间数据有不完整的条目时,此选项很有用,例如在这种情况下缺少秒数(然后设置为00)

然后可以将
dmy\u hms()
的输出包装成
格式()
,以获得所需的格式:

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))

df1我们可以使用lubridate的
dmy_hms()
函数和选项
truncated=1
来生成一个POSIXct对象。当时间数据有不完整的条目时,这个选项很有用,比如在这种情况下缺少秒数(然后设置为00)

然后可以将
dmy\u hms()
的输出包装成
格式()
,以获得所需的格式:

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))

df1首先,您必须转换为字符:可能作为
as.POSIXct(as.character(XXX$Start.Timestamp))
会有所帮助。在这里,您可以使用首选的表示形式创建任何您想要的格式。@drmariod我认为这不起作用。希望出现“不是标准明确格式”类型的错误消息“。首先您必须转换为字符:可能as
as.POSIXct(as.character(XXX$Start.Timestamp))
会有所帮助。在这里,您可以使用首选表示创建任何格式。@drmariod我认为这行不通。需要一条类型为“非标准明确格式”的错误消息。函数
substring()
是矢量化的。在这种情况下,
*apply()
循环的速度和复杂度是不必要的。您可以使用
子字符串(df$Start.Timestamp,first=1,last=16)
。函数
substring()
是矢量化的。在这种情况下,
*apply()
循环的速度和复杂度是不必要的。您可以使用
子字符串(df$Start.Timestamp,first=1,last=16)
。谢谢您的输入!!这样做没有任何问题,并帮助我继续计算研究期间每小时的正确实例数!谢谢你的意见!!这样做没有任何问题,并帮助我继续计算研究期间每小时的正确实例数!