R에서 SQL Server에서 CROSS APPLY를 사용하는 것과 동일한 작업을 수행하는 방법은 무엇입니까?

ash25

내부 데이터 프레임의 각 행에 대해 외부 데이터 프레임의 각 행에 대한 조건을 실행하는 방법입니다.) 두 개의 데이터 프레임이 있습니다.

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관