R 通过使用数据帧进行筛选来对_分组

R 通过使用数据帧进行筛选来对_分组,r,filter,dplyr,group-by,R,Filter,Dplyr,Group By,我有一个由时间序列数据组成的TIBLE。在每个时间步,我都有一个与测试标识(FName)相关联的给定载荷(Loadz)和位移(Dispz): #一个tible:15926 x 5 #组别:FName[92] 时间戳FName Dispz Loadz Failflag 1 2020-09-19 14:56:46 D-H10 2020-09-19 14:56:46.5 D-H1 0.019 3.61“ 3 2020-09-19 14:56:47 D-H1 0.04 8.91“ 4 2020-09-1

我有一个由时间序列数据组成的TIBLE。在每个时间步,我都有一个与测试标识(FName)相关联的给定载荷(Loadz)和位移(Dispz):

#一个tible:15926 x 5
#组别:FName[92]
时间戳FName Dispz Loadz Failflag
1 2020-09-19 14:56:46 D-H10
2020-09-19 14:56:46.5 D-H1 0.019 3.61“
3 2020-09-19 14:56:47 D-H1 0.04 8.91“
4 2020-09-1914:56:47.5D-H10.0614.5“
5 2020-09-19 14:56:48 D-H1 0.0790 20.1“
6 2020-09-1914:56:48.5D-H10.10125.7“
7 2020-09-19 14:56:49 D-H1 0.12 31.2“
8 2020-09-19 14:56:49.5 D-H1 0.142 36.1“
92020-09-1914:56:50D-H10.16240.9“
102020-09-1914:56:50.5D-H10.18345.9“
我有下面的代码,它过滤掉低于某个阈值的所有荷载和位移(对于大于0.02mm的位移和超过10N的荷载),然后扫描(或归零)所有内容,以便所有测试从原点开始

dat<-df%>%
  group_by(FName)%>%
  filter(Dispz>0.02)%>%
  filter(Loadz>10)%>%
  mutate_if(is.numeric,funs(.-first(.)))%>%
  slice(1:which.max(Loadz))
dat%
分组依据(FName)%>%
过滤器(Dispz>0.02)%%>
过滤器(负载z>10)%>%
如果(是数字,funs(.-first(.))%>%,则进行变异
切片(1:which.max(Loadz))
但是,我有一些测试有一些错误,需要手动强制。这就是我遇到麻烦的地方

我有那些行为不端测试的FName标识,以及我需要将数据归零的位置处的相关时间戳值,但找到一种使用查找数据框过滤的方法,该数据框也会从该查找表中查找值,这是一个挑战

    # Identify FName ids that need to be manually modified
    badlist<-c("WR-H2.2",
               "WR-H2.3", 
               "WR-H2.4")
#Find associated timestamps with each respective FName label
        timelist<-c("2020-10-04 12:31:06",
                    "2020-10-04 12:32:28",
                    "2020-10-04 12:33:46.5")

#Sample ID, and associated row to 
maninput<-tibble(x=badlist,y=timelist)
#识别需要手动修改的FName ID

badlist这是连接的主要用例。您可以通过
left\u join
使用
maninput
one来轻松解决此问题,然后通过与添加的列进行比较进行过滤

您没有提供任何可直接使用的示例数据,因此我自己制作了:

库(tidyverse)
图书馆(lubridate)
种子集(0)
最长时间=ymd\U hms(“欧洲中部时间2020-11-02 11:07:00”)
名称=c(“D-H1”、“WR-H2.2”、“WR-H2.3”、“WR-H2.4”)
obs=10
df=名称%>%
map(~tibble(FName=.x,
Dispz=总和(绝对绝对值(绝对值))*0.3,
载荷z=总和(绝对值)(绝对值)(绝对值)(绝对值)(绝对值))*10,
TIMESTAMP=seq(max_time-obs,max_time-1,length.out=obs),
Failflag=“”)%%>%
绑定_行()
dat=df%>%
分组依据(FName)%>%
过滤器(Dispz>0.02)%%>
过滤器(负载z>10)%>%
变异(跨越(其中(是数值的),~.x-第一个(.x)))%>%
切片(1:which.max(Loadz))%>%
解组()
坏名单=c(“WR-H2.2”、“WR-H2.3”)
时间列表=c(“2020-11-02 11:06:54 CET”,“2020-11-02 11:06:57 CET”)
maninput=tibble(x=badlist,y=ymd_hms(时间列表))
现在,您可以执行加入操作:

newdat=dat%>%
分组依据(FName)%>%
左联合(maninput,by=c(“FName”=“x”))%>%
过滤器(is.na(y)|时间戳>y)%>%
选择(-y)
如前所述,我们首先加入
maninput
表,为
FName
maninput
中的
x
值匹配的每个测试创建一个
y
列。然后我们过滤,只选择
y
列为
NA
(即
maninput
中没有匹配测试)或
时间戳大于
y
列的观察值(即
maninput
中的指定时间之后发生的观察值)。然后我们从数据中删除
y
列,因为不再需要它

这导致了一个TIBLE,其中选定的测试只在其各自的时间戳之后有数据,我很确定这就是您所寻找的:

# A tibble: 23 x 5
# Groups:   FName [4]
   FName   Dispz Loadz TIMESTAMP           Failflag
   <chr>   <dbl> <dbl> <dttm>              <chr>   
 1 D-H1    0      0    2020-11-02 11:06:51 ""      
 2 D-H1    0.399 11.5  2020-11-02 11:06:52 ""      
(...)     
 9 D-H1    2.46  49.7  2020-11-02 11:06:59 ""      
10 WR-H2.2 0.409 25.3  2020-11-02 11:06:55 ""      
11 WR-H2.2 0.735 35.2  2020-11-02 11:06:56 ""      
12 WR-H2.2 0.942 39.5  2020-11-02 11:06:57 ""      
13 WR-H2.2 1.33  51.9  2020-11-02 11:06:58 ""      
14 WR-H2.2 1.34  54.7  2020-11-02 11:06:59 ""      
15 WR-H2.3 1.98  41.2  2020-11-02 11:06:58 ""      
16 WR-H2.3 2.05  53.8  2020-11-02 11:06:59 ""      
17 WR-H2.4 0      0    2020-11-02 11:06:53 ""      
18 WR-H2.4 0.244  6.64 2020-11-02 11:06:54 ""      
(...)
23 WR-H2.4 0.949 43.8  2020-11-02 11:06:59 ""       
#一个tible:23x5
#组别:FName[4]
FName Dispz Loadz时间戳故障标志
1D-H1002020-11-02 11:06:51“
2 D-H10.399 11.5 2020-11-02 11:06:52“
(...)     
9 D-H1 2.46 49.7 2020-11-02 11:06:59“
10 WR-H2.20.409 25.3 2020-11-02 11:06:55“
11 WR-H2.2 0.735 35.2 2020-11-02 11:06:56“
12 WR-H2.20.942 39.5 2020-11-02 11:06:57“
13 WR-H2.2 1.33 51.9 2020-11-02 11:06:58“
14 WR-H2.21.34 54.7 2020-11-02 11:06:59“
15 WR-H2.3 1.98 41.2 2020-11-02 11:06:58“
16 WR-H2.3 2.05 53.8 2020-11-02 11:06:59“
17 WR-H2.4 0 2020-11-02 11:06:53“
18 WR-H2.4 0.2446.64 2020-11-02 11:06:54“
(...)
23 WR-H2.4 0.949443.8 2020-11-02 11:06:59“

如果您能提供一些您试图对数据进行的“测试”的细节,那就更好了。谢谢shizundeiku!为了澄清,是否将“maninput”视为正在连接到dat=x的“y”表?by(FName=“x”)在这个实例中做了什么?为什么过滤器(is.na(y))不会影响坏名单上的所有FName?这有点旁敲侧击,但是有没有一个来源可以帮助我理解这是怎么回事:“mutate(mutate(mutate)(跨越(where(is.numeric),~.x-first(.x))”?“~.x”把我甩了。是的,
maninput
y
表。
by
指定
dat
中的每个
FName
对应于
maninput
中的
x
<代码>过滤器(is.na(y))
选择列
y
na
的数据点,而不是另一个变量。对于您询问的行,您应该了解跨
功能:
.fns
参数(包含
~.x
)已指定为“purr样式lambda”,请参见此处了解这些参数的具体工作方式:
Newdat<-dat%>%
    group_by(FName)%>%
    filter(TIMESTAMP>maninput[FName== "group_by(FName)",2]
# A tibble: 23 x 5
# Groups:   FName [4]
   FName   Dispz Loadz TIMESTAMP           Failflag
   <chr>   <dbl> <dbl> <dttm>              <chr>   
 1 D-H1    0      0    2020-11-02 11:06:51 ""      
 2 D-H1    0.399 11.5  2020-11-02 11:06:52 ""      
(...)     
 9 D-H1    2.46  49.7  2020-11-02 11:06:59 ""      
10 WR-H2.2 0.409 25.3  2020-11-02 11:06:55 ""      
11 WR-H2.2 0.735 35.2  2020-11-02 11:06:56 ""      
12 WR-H2.2 0.942 39.5  2020-11-02 11:06:57 ""      
13 WR-H2.2 1.33  51.9  2020-11-02 11:06:58 ""      
14 WR-H2.2 1.34  54.7  2020-11-02 11:06:59 ""      
15 WR-H2.3 1.98  41.2  2020-11-02 11:06:58 ""      
16 WR-H2.3 2.05  53.8  2020-11-02 11:06:59 ""      
17 WR-H2.4 0      0    2020-11-02 11:06:53 ""      
18 WR-H2.4 0.244  6.64 2020-11-02 11:06:54 ""      
(...)
23 WR-H2.4 0.949 43.8  2020-11-02 11:06:59 ""