R 根据条件为变量中的更改提取行
我的数据包括运动员在不同时期完成的活动的时间戳。每个时段最多持续20分钟。注意相应的天气条件 我想说出第一次发生的天气和情况变化。我的问题与类似,只是我想要第一次出现,以及发生变化的时间 我的数据结构如下:R 根据条件为变量中的更改提取行,r,R,我的数据包括运动员在不同时期完成的活动的时间戳。每个时段最多持续20分钟。注意相应的天气条件 我想说出第一次发生的天气和情况变化。我的问题与类似,只是我想要第一次出现,以及发生变化的时间 我的数据结构如下: df <- data.frame(Time=c("0:00:00","0:01:00","0:02:40","0:12:09", "0:00:00", "0:02:07","0:07:19","0:15:16",
df <- data.frame(Time=c("0:00:00","0:01:00","0:02:40","0:12:09",
"0:00:00", "0:02:07","0:07:19","0:15:16",
"0:00:00", "0:03:00","0:08:40","0:13:29",
"0:00:00", "0:02:10","0:08:47","0:17:55"),
Athlete = c('Paul', 'Paul', 'Paul', 'Paul',
'Paul', 'Paul', 'Paul','Paul',
'Joe', 'Joe', 'Joe', 'Joe',
'Joe', 'Joe', 'Joe', 'Joe'),
Period = c('P1', 'P1', 'P1', 'P1',
'P2', 'P2', 'P2', 'P2',
'P1', 'P1', 'P1', 'P1',
'P2', 'P2', 'P2', 'P2'),
Weather = c('Sunny', 'Sunny', 'Sunny', 'Cloudy',
'Rain', 'Cloudy', 'Rain', 'Rain',
'Rain', 'Sunny', 'Rain', 'Rain',
'Sunny', 'Sunny', 'Cloudy', 'Cloudy'))
df我建议使用类似“data.table”中的rleid
。有了这些,您可以:
library(data.table)
as.data.table(df)[, ind := sequence(.N), rleid(Athlete, Period, Weather)][ind == 1]
## Time Athlete Period Weather ind
## 1: 0:00:00 Paul P1 Sunny 1
## 2: 0:12:09 Paul P1 Cloudy 1
## 3: 0:00:00 Paul P2 Rain 1
## 4: 0:02:07 Paul P2 Cloudy 1
## 5: 0:07:19 Paul P2 Rain 1
## 6: 0:00:00 Joe P1 Rain 1
## 7: 0:03:00 Joe P1 Sunny 1
## 8: 0:08:40 Joe P1 Rain 1
## 9: 0:00:00 Joe P2 Sunny 1
## 10: 0:08:47 Joe P2 Cloudy 1
关于你的问题“我如何用分秒来表示时间?例如:2.40——这不是表示时间的标准方式,是吗?0.4*60=24
,因此我不建议以这种方式转换时间
如果您想将这些值作为数值,也许可以将它们拆分为单独的列。为此,我推荐我的“splitstackshape”包
“Time\u 1
”将是小时,Time\u 2
”将是分钟,“Time\u 3
”将是秒
如果你真的想要你所描述的“时间”专栏,你可以这样做:
df$Time <- as.numeric(sub(":", ".", gsub("^[^:]*:", "", df$Time)))
我建议使用类似于“data.table”中的rleid
。这样您可以:
library(data.table)
as.data.table(df)[, ind := sequence(.N), rleid(Athlete, Period, Weather)][ind == 1]
## Time Athlete Period Weather ind
## 1: 0:00:00 Paul P1 Sunny 1
## 2: 0:12:09 Paul P1 Cloudy 1
## 3: 0:00:00 Paul P2 Rain 1
## 4: 0:02:07 Paul P2 Cloudy 1
## 5: 0:07:19 Paul P2 Rain 1
## 6: 0:00:00 Joe P1 Rain 1
## 7: 0:03:00 Joe P1 Sunny 1
## 8: 0:08:40 Joe P1 Rain 1
## 9: 0:00:00 Joe P2 Sunny 1
## 10: 0:08:47 Joe P2 Cloudy 1
关于你的问题“我怎么能有分秒的时间?”?例如:2.40——这不是表达时间的标准方式,是吗0.4*60=24
,因此我不建议以这种方式转换它
如果希望将这些值作为数值,或许可以将它们拆分为单独的列。为此,我推荐我的“splitstackshape”软件包
“Time\u 1
”将是小时,Time\u 2
”将是分钟,“Time\u 3
”将是秒
如果你真的想要你所描述的“时间”专栏,你可以这样做:
df$Time <- as.numeric(sub(":", ".", gsub("^[^:]*:", "", df$Time)))
非超优雅版本:
df %>% filter(c(1,diff(as.numeric(Athlete)))!=0 |
c(1,diff(as.numeric(Weather)))!=0 |
c(1,diff(as.numeric(Period)))!=0)
请注意,这需要以正确的方式对数据进行排序。非超优雅版本:
df %>% filter(c(1,diff(as.numeric(Athlete)))!=0 |
c(1,diff(as.numeric(Weather)))!=0 |
c(1,diff(as.numeric(Period)))!=0)
请注意,这需要以正确的方式对数据进行排序。as.difftime(as.character(df$Time),format=“%H:%M:%S”)
如果您愿意不使用lubridate。as.difftime(as.character(df$Time),format=“%H:%M:%S”)
如果您愿意不使用lubridate。如果时间以小时:分钟:秒:毫秒为单位,例如,00:12:09:01,我如何使用您的gsub
代码提取12.09?@user2716568,有几种方法。这里有一个:x对于另一个问题表示歉意,但是我如何使用您的代码从包含hours.minutes.seconds:ms的列中提取minutes.seconds:ms的data.framedf$Time
@user2716568,您熟悉正则表达式吗?正则表达式使用括号来捕获组。在上面的评论中,我只捕获了一个组(并返回了“\\1”
。您可以使用多组括号捕获多组数据。@user2716568,这也是为什么我建议使用cSplit
方法一次性拆分为多个列,并从中处理数据……如果Time
以小时:分钟:秒:毫秒为单位,例如00:12:09:01,我将如何处理请使用您的gsub
代码提取12.09?@user2716568,有几种方法。这里有一种:x对于另一个问题表示歉意,但是我如何使用您的代码从包含小时.分钟.秒的列中提取分.秒:数据帧中的毫秒df$Time
@user2716568,您熟悉吗h正则表达式?正则表达式使用括号来捕获组。在上面的注释中,我只捕获了一个组(并返回了“\\1”
。您可以使用多组括号捕获多组数据。@user2716568,这也是为什么我建议使用cSplit
方法一次性拆分为多个列,并从中处理数据。。。。
df %>% filter(c(1,diff(as.numeric(Athlete)))!=0 |
c(1,diff(as.numeric(Weather)))!=0 |
c(1,diff(as.numeric(Period)))!=0)