내부 데이터 프레임의 각 행에 대해 외부 데이터 프레임의 각 행에 대한 조건을 실행하는 방법입니다.) 두 개의 데이터 프레임이 있습니다.
ToTest
Origin.State Dest.State Ship.Date Cost
1 IL NY 2015-03-25 10
2 IL NY 2015-03-25 10
3 IL NY 2015-03-24 10
4 IL NY 2015-03-23 10
5 IL NY 2015-03-18 10
6 PA NY 2015-04-29 10
7 PA NY 2015-04-29 10
8 PA NY 2015-04-27 10
9 PA NY 2015-04-24 10
10 PA NY 2015-03-01 10
11 IL TX 2015-05-18 10
12 IL TX 2015-05-18 10
13 IL TX 2015-05-14 10
14 IL TX 2015-05-12 10
15 IL TX 2015-05-13 10
TestShipmentGroup1
Origin.State Dest.State Ship.Date
1 IL NY 2015-03-25
2 IL NY 2015-03-24
3 IL NY 2015-03-23
4 IL NY 2015-03-18
5 PA NY 2015-04-29
6 PA NY 2015-04-27
7 PA NY 2015-04-24
8 PA NY 2015-03-01
9 IL TX 2015-05-18
10 IL TX 2015-05-14
11 IL TX 2015-05-12
12 IL TX 2015-05-13
한 번 에 TestShipmentGroup1 데이터 프레임 의 각 행을 사용하여 ToTest 데이터 프레임의 모든 행에 아래 표시된 조건을 적용하려고합니다 .
for (i in 1: nrow(TestShipmentGroup1))
{
TestShipmentGroup1%>%
select(Origin.State,Dest.State,Ship.Date)
ToTest%>%
select(Origin.State, Dest.State,Ship.Date,Cost) %>%
filter (((ToTest$Ship.Date >= (TestShipmentGroup1$Ship.Date-7))
& (ToTest$Ship.Date < TestShipmentGroup1$Ship.Date))
& (ToTest$Origin.State == TestShipmentGroup1$Origin.State)
& (ToTest$Dest.State == TestShipmentGroup1$Dest.State))}
merge
결합 변수없이 사용하는 교차 결합 (두 세트에서 데카르트 곱 MXN 반환)을 고려한 다음 필터 조건을 적용합니다. 또는 나중에 필터가있는 상태에서 병합 된 내부 조인도 작동합니다. 그러나 충돌을 피하기 위해 먼저 열의 이름을 바꿉니다.
library(dplyr)
...
names(ToTest) <- paste0(names(ToTest), "1")
names(TestShipmentGroup1) <- paste0(names(TestShipmentGroup1), "2")
# CROSS JOIN WITH FILTER
finaldf <- merge(select(ToTest, Origin.State1, Dest.State1, Ship.Date1),
select(TestShipmentGroup1, Origin.State2, Dest.State2, Ship.Date2)),
all=TRUE) %>%
filter (((Ship.Date1 >= (Ship.Date2-as.difftime(7, unit="days")))
& (Ship.Date1 < Ship.Date2))
& (Origin.State1 == Origin.State2)
& (Dest.State1 == Dest.State2))
# INNER JOIN WITH FILTER
finaldf <- inner_join(select(ToTest, Origin.State1, Dest.State1, Ship.Date1),
select(TestShipmentGroup1, Origin.State2, Dest.State2, Ship.Date2),
by = c("Origin.State1"="Origin.State2", "Dest.State1"="Dest.State2")) %>%
filter ((Ship.Date1 >= (Ship.Date2-as.difftime(7, unit="days")))
& (Ship.Date1 < Ship.Date2))
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다