Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 根据条件为变量中的更改提取行_R - Fatal编程技术网

R 根据条件为变量中的更改提取行

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",

我的数据包括运动员在不同时期完成的活动的时间戳。每个时段最多持续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",
                        "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.frame
df$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)