在一分钟数据框中过滤天数(在 R 中)

问题描述 投票:0回答:1

现在学习 R 大约一个月了,第一篇文章在这里,所以我会尽量具体和简短,但如果它仍然太抽象和难以使用,请原谅我。

我有一个分钟数据框(如“ymd_hms”),用于跟踪(比方说)不同人/ID 一个月内每分钟的步数。基本上,每个 ID 该月每天的每一分钟都有条目(为了简单起见,忽略丢失或未跟踪的数据)。看起来像这样(步骤是随机值 x 或 0):

身份证 时间 步骤
A 2020-04-01 00:00:00 ...
A 2020-04-01 00:01:00
A 2020-04-01 00:02:00
A ...
A 2020-04-30 23:59:00
B 2020-04-01 00:00:00
B 2020-04-01 00:01:00
B 2020-04-01 00:02:00
B ...
B 2020-04-30 23:59:00
... ...

(真实数据有1,434,540行)

现在,我想从这个数据框中过滤掉每天的总步数/总和为 0 的数据。我想保留原始的分钟数据帧,但删除总步长等于 0 的所有天的所有行。因此,简单地过滤掉每一行为 0 的行不是一个选项。

我能够做的是创建一个每日数据框,过滤掉每天有问题的数据。

Steps_df %>% 
  group_by(ID, as.Date(Time)) %>% 
  summarise(sum(Steps)) %>% 
  filter(`sum(Steps)`!=0)

但是,就像我之前说的,我想保留上面所示的分钟数据帧并删除其中的所有内容(意味着步数总数为 0 的日子的每个条目;通常应该是 1440 行,只要有没有丢失分钟条目)。

显然,如果我将上面的代码块更改为“...==0”,我将获得需要过滤掉每一行的所有 ID 和日期组合。我得到的结果看起来像这样。

身份证
as.Date(Time)
sum(Steps)
F 2020-04-12 0
F 2020-04-13 0
F 2020-04-14 0
M 2020-04-13 0
M 2020-04-22 0
... ... 0

(实际大约170行)

我能想到的唯一解决方案就是基本上手动过滤掉这 170 个组合中的每一个,如下所示:

Steps_df <- Steps_df %>%
  filter(!(Id=="F" & grepl("2020-04-12", Time)))

这确实会删除该 ID 和日期组合的所有行,但由于这些组合大约有 170 个,所以这确实不是一个选择。

有没有什么方法可以更有效地做到这一点? 是通过过滤分钟数据框中的天数,还是通过将最后一个代码块应用于所有组合,而不必键入其中的 170 个?

我在网上搜索了几个小时,但没有找到任何对我有帮助的东西。

r datetime filter
1个回答
0
投票

您的问题是您正在使用

summarize
,它将所有内容折叠为每组 1 行。您可以使用
mutate
来代替,以保持相同的行数:

steps_df %>% 
  group_by(ID, as.Date(Time)) %>% 
  mutate(steps_per_day = sum(Steps)) %>% 
  filter(steps_per_day != 0)

但你也可以跳过

mutate
并在
filter
中进行求和计算:

steps_df %>% 
  group_by(ID, as.Date(Time)) %>% 
  filter(sum(steps) != 0)
© www.soinside.com 2019 - 2024. All rights reserved.