2014-11-28 8 views
2

3 백만 행과 10 열의 데이터 프레임을 다루고 있으며 일부 서브 세트 작업을 수행 중입니다. 아래에 장난감 코드가 있습니다. 부분 집합을하면 오랜 시간이 걸립니다. data.table을 사용하고 data.table에서 하위 집합을 사용하면 속도가 빨라 집니까? 내가 data.table 사용하여 비슷한 일을 할 수있는 방법data.frame 대신 data.table을 사용하여 서브 세트 사용

result <- subset(dat, as.numeric(s) == 100 
        & p == 5 
        & name == "bob" 
        & time >= "2014-10-27 18:11:36 PDT" 
        & time <= "2014-10-27 18:12:00 PDT" 
        ) 
    result 

    s p name    time 
1 100 5 bob 2014-10-27 18:11:36 
2 100 5 bob 2014-10-27 18:11:37 
3 100 5 bob 2014-10-27 18:11:38 

: 여기

s<-c(100,100,100,800,800,6662,33565,265653262,266532) 
p<-c(5,5,5,10,10,10,8,9,10) 
name<-c("bob","bob","bob","ed","ed","ed","joe","frank","ted") 
time<- as.POSIXct(as.character(c("2014-10-27 18:11:36 PDT","2014-10-27 18:11:37 PDT","2014-10-27 18:11:38 PDT","2014-10-27 18:11:39 PDT","2014-10-27 18:11:40 PDT","2014-10-27 18:11:41 PDT","2014-10-27 19:11:36 PDT","2014-10-27 20:11:36 PDT","2014-10-27 21:11:36 PDT"))) 
dat<- data.frame(s,p,name,time) 
dat 

데이터 프레임 :

  s p name    time 
1  100 5 bob 2014-10-27 18:11:36 
2  100 5 bob 2014-10-27 18:11:37 
3  100 5 bob 2014-10-27 18:11:38 
4  800 10 ed 2014-10-27 18:11:39 
5  800 10 ed 2014-10-27 18:11:40 
6  6662 10 ed 2014-10-27 18:11:41 
7  33565 8 joe 2014-10-27 19:11:36 
8 265653262 9 frank 2014-10-27 20:11:36 
9 266532 10 ted 2014-10-27 21:11:36 

가 지금은 dataframe에 부분 집합 여기에 몇 가지 장난감 코드는 ?

감사합니다.

답변

3

글쎄, 예제 코드는 실제로 "시간"셀렉터 덕분에 데이터 프레임을 깨뜨린 다. 즉, 데이터 프레임의 POSIXlt 날짜를 문자열의 셀렉터에 맞추려고한다. 나는 당신이 원하는 생각 :

result <- subset(dat, as.numeric(s) == 100 
       & p == 5 
       & name == "bob" 
       & time >= as.POSIXlt("2014-10-27 18:11:36 PDT") 
       & time <= as.POSIXlt("2014-10-27 18:12:00 PDT") 
       ) 

result 
    s p name    time 
1 100 5 bob 2014-10-27 18:11:36 
2 100 5 bob 2014-10-27 18:11:37 
3 100 5 bob 2014-10-27 18:11:38 

이 구문은 data.tables 잘 완벽하게 작동합니다 :

dat <- as.data.table(dat) 
result <- subset(dat, 
       as.numeric(s) == 100 
       & p == 5 
       & name == "bob" 
       & time >= as.POSIXlt("2014-10-27 18:11:36 PDT") 
       & time <= as.POSIXlt("2014-10-27 18:12:00 PDT") 
) 
result 

    s p name    time 
1: 100 5 bob 2014-10-27 18:11:36 
2: 100 5 bob 2014-10-27 18:11:37 
3: 100 5 bob 2014-10-27 18:11:38 

더 data.table-같은, 당신은 "일부"완전히 대신 단지 피할 수 원하는 경우 data.table을 직접 조작하십시오.

dat <- as.data.table(dat) 
result <- dat[as.numeric(s) == 100 
       & p == 5 
       & name == "bob" 
       & time >= as.POSIXlt("2014-10-27 18:11:36 PDT") 
       & time <= as.POSIXlt("2014-10-27 18:12:00 PDT"),] 

result 

    s p name    time 
1: 100 5 bob 2014-10-27 18:11:36 
2: 100 5 bob 2014-10-27 18:11:37 
3: 100 5 bob 2014-10-27 18:11:38 
+0

내 코드가 손상되지 않았습니다. data.table을 사용하면 data.frame을 사용하는 것보다 빠를 것입니까? – user3022875

+0

그렇다면 POSIX 타임 스탬프가 문자열보다 작거나 큰지를 확인하기 위해 어떤 환경을 사용해야하는지 잘 모르겠다;). 부분 집합 연산의 경우? 그것을 벤치 마크하고 테스트하십시오. 필자는 데이터에 대해 부분 집합 연산을 수행하여 값을 추출하거나 합성하려는 상황에서 data.table을 사용하는 경향이 있습니다. 훨씬 더 빠릅니다. –

관련 문제