그래서 저는 R에 다소 익숙하지 않으며 알아 내기가 다소 어려운 조건에 따라 열 값을 반환하려고합니다!
작업중인 두 개의 데이터베이스가 있습니다. 하나는 일반적으로 각 행에 단일 유닉스 시간 번호가있는 70,000 개의 행입니다 (df1이라고 부릅니다). 다른 하나는 시작 시간 및 종료 시간 (내가 유닉스 시간 번호로 변환 함)과 여러 참가자의 시작 및 종료 시간 사이에 완료된 활동 이름 (df2라고 함)을 제공합니다.
나는 다음과 같은 df1에서 사용하는 데이터의 참가자에게 df2를 필터링했습니다.
head(df2, 5)
Name Period.Name Start.Time End.Time Unix.Start.Time Unix.End.Time
27 Name 1 Period 1 17:59:40 18:11:00 1579075181 1579075860
53 Name 1 Period 2 18:11:59 18:15:13 1579075919 1579076114
79 Name 1 Period 3 18:17:55 18:23:22 1579076275 1579076603
96 Name 1 Period 4 18:24:58 18:31:56 1579076699 1579077116
131 Name 1 Period 5 18:37:45 18:45:30 1579077465 1579077930
df1은 다음과 같습니다.
head(df1, 20)
data.point Label Timestamp Name dateCode
1 0 Label 1 1579075180 Name 1 200115
2 1 Label 1 1579075181 Name 1 200115
3 1 Label 1 1579075182 Name 1 200115
4 2 Label 1 1579075183 Name 1 200115
5 2 Label 1 1579075184 Name 1 200115
6 2 Label 1 1579075185 Name 1 200115
7 1 Label 1 1579075186 Name 1 200115
8 1 Label 1 1579075187 Name 1 200115
9 1 Label 1 1579075188 Name 1 200115
10 3 Label 1 1579075189 Name 1 200115
11 3 Label 1 1579075190 Name 1 200115
12 3 Label 1 1579075191 Name 1 200115
13 3 Label 1 1579075192 Name 1 200115
14 4 Label 1 1579075193 Name 1 200115
15 4 Label 1 1579075194 Name 1 200115
16 4 Label 1 1579075195 Name 1 200115
17 2 Label 1 1579075196 Name 1 200115
18 2 Label 1 1579075197 Name 1 200115
19 1 Label 1 1579075198 Name 1 200115
20 0 Label 1 1579075199 Name 1 200115
df1 $ Timestamp 값이 df2 $ Unix.Start.Time과 df2 $ Unix.End.Time 사이에있는 경우 df2 $ Period.Name에서 각 기간 이름을 반환하는 df1에 새 열을 만들려고합니다.
data.point Label Timestamp Name dateCode Period
1 0 Label 1 1579075180 Name 1 200115 Null
2 1 Label 1 1579075181 Name 1 200115 Period 1
3 1 Label 1 1579075182 Name 1 200115 Period 1
4 2 Label 1 1579075183 Name 1 200115 Period 1
5 2 Label 1 1579075184 Name 1 200115 Period 1
6 2 Label 1 1579075185 Name 1 200115 Period 1
7 1 Label 1 1579075186 Name 1 200115 Period 1
8 1 Label 1 1579075187 Name 1 200115 Period 1
9 1 Label 1 1579075188 Name 1 200115 Period 1
10 3 Label 1 1579075189 Name 1 200115 Period 1
...
1001 3 Label 1 1579075916 Name 1 200115 Null
1002 3 Label 1 1579075917 Name 1 200115 Null
1003 3 Label 1 1579075918 Name 1 200115 Null
1004 4 Label 1 1579075919 Name 1 200115 Period 2
1005 4 Label 1 1579075920 Name 1 200115 Period 2
1006 4 Label 1 1579075921 Name 1 200115 Period 2
1007 2 Label 1 1579075922 Name 1 200115 Period 2
1008 2 Label 1 1579075923 Name 1 200115 Period 2
1009 1 Label 1 1579075924 Name 1 200115 Period 2
1010 0 Label 1 1579075925 Name 1 200115 Period 2
이것은 일주일에 몇 번 완료되는 프로세스이며 두 데이터 프레임의 길이가 다를 때마다 타임 스탬프도 다릅니다.
ifelse 함수를 시도했지만 모든 df2 유닉스 시점에서 df1 $ Timestamp 값을 평가하고 df1 $ Timestamp가 맞는 기간 이름에서 행 값을 반환하는 방법을 알아낼 수 없었습니다.
미리 감사드립니다!
패키지 fuzzy_.*_join
에서 사용해보십시오 fuzz_join
.
fuzzyjoin::fuzzy_inner_join(df1, df2,
by = c('Name' = 'Name', 'Timestamp' = 'Unix.Start.Time',
'Timestamp' = 'Unix.End.Time'), match_fun = list(`==`, `>=`, `<=`))
또는 표준 조인을 시도한 다음 filter
기본 R에서 수행 할 수있는 값을 시도 할 수 있습니다.
subset(merge(df1, df2, by = 'Name'),
Timestamp >= Unix.Start.Time & Timestamp <= Unix.End.Time)
또는 dplyr
library(dplyr)
inner_join(df1, df2, by = 'Name') %>%
filter(Timestamp >= Unix.Start.Time & Timestamp <= Unix.End.Time)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다