2017-02-11 1 views
2

data.table은 유용한 가치를 제공하는 rleid 기능을 제공합니다. 감시되는 변수가 변경되고 다른 변수에 의해 순서가 바뀌면 시세표 역할을합니다.sparklyr의 런 길이 ID

library(dplyr) 


tbl = tibble(time = as.integer(c(1, 2, 3, 4, 5, 6, 7, 8)), 
      var = c("A", "A", "A", "B", "B", "A", "A", "A")) 

> tbl 
# A tibble: 8 × 2 
    time var 
    <int> <chr> 
1  1  A 
2  2  A 
3  3  A 
4  4  B 
5  5  B 
6  6  A 
7  7  A 
8  8  A 

원하는 결과는 내가 sparklyr에서 제공하는 도구를 사용하여 비슷한 재현 할 수 있는지 궁금

> tbl %>% mutate(rleid = data.table::rleid(var)) 
# A tibble: 8 × 3 
    time var rleid 
    <int> <chr> <int> 
1  1  A  1 
2  2  A  1 
3  3  A  1 
4  4  B  2 
5  5  B  2 
6  6  A  3 
7  7  A  3 
8  8  A  3 

입니다. 테스트 할 때, 필자는 필자가 채우기를해야 할 시점까지 도달 할 수 있다고 생각했지만 달성 할 수 없었습니다. 내가 SparkR를 사용하려고했습니다

library(sparklyr) 

spark_install(version = "2.0.2") 
sc <- spark_connect(master = "local", 
        spark_home = spark_home_dir()) 


spk_tbl = copy_to(sc, tbl, overwrite = TRUE) 

spk_tbl %>% 
    mutate(var2 = (var != lag(var, 1L, order = time))) %>% # Thanks @JaimeCaffarel 
    mutate(var3 = if(var2) { paste0(time, var) } else { NA }) 

Source: query [8 x 4] 
Database: spark connection master=local[4] app=sparklyr local=TRUE 

    time var var2 var3 
    <int> <chr> <lgl> <chr> 
1  1  A TRUE 1A 
2  2  A FALSE <NA> 
3  3  A FALSE <NA> 
4  4  B TRUE 4B 
5  5  B FALSE <NA> 
6  6  A TRUE 6A 
7  7  A FALSE <NA> 
8  8  A FALSE <NA> 

그러나 나는 많은 sparklyr 인터페이스와 사용의 편리 성을 선호하는, 그래서 이상적으로 스파크 SQL에서이 작업을 수행 할 수있을 것입니다.

데이터를 충분히 작은 청크로 분할하고, 기능을 실행하고 다시 전송함으로써 이미 수행 할 수 있습니다.

문맥 상, rleid이 유용하다는 것을 알게 된 이유는 많은 열차 데이터로 작업한다는 것이고, 실행중인 항목에 대해 색인을 생성하는 것이 유용하다는 것입니다. 어떤 도움

감사 아킬

+0

을 나는 당신이 사용할 수 있다고 생각 : 'TBL %> % mutate (rleid = (var! = lag (var, 1, default = "asdf"))) %> % mutate (rleid = cumsum (rleid))'기본적으로이 해결책입니다 : http://stackoverflow.com/a/33510765/2026277 –

+0

@JaimeCaffarel 나는 그것을하기위한 깔끔한'cumsum '방법을 알아 채지 못했습니다 ... 불행히도'cumsum'은 Spark-SQL에서 작동하지 않습니다 (또는 적어도 작동시키지 못하는 것 같습니다). % 돌연변이 체 (rleid = cumsum (rleid))는 다음과 같이 나타낼 수 있습니다 : % 돌연변이 체 (rleid = cumsum (rleid)) ' –

+0

OH! 내가 틀렸어. 그냥 먼저 boolean을 int로 캐스팅해야했습니다. 감사! 답변을 추가하고 받아 들일 수 있습니다. 다시 한 번 감사합니다 –

답변

1

sparklyr에서 작업 솔루션이 될 것이다 :

spk_tbl %>% 
    dplyr::arrange(time) %>% 
    dplyr::mutate(rleid = (var != lag(var, 1, order = time, default = FALSE))) %>% 
    dplyr::mutate(rleid = cumsum(as.numeric(rleid))) 
0

이 시도 :

tbl %>% mutate(run = c(0,cumsum(var[-1L] != var[-length(var)]))) 
# A tibble: 8 × 3 
    time var run 
    <int> <chr> <dbl> 
1  1  A  0 
2  2  A  0 
3  3  A  0 
4  4  B  1 
5  5  B  1 
6  6  A  2 
7  7  A  2 
8  8  A  2 
+0

감사합니다. 그냥 원래 주석 답변에서와 같은 스파크 SQL에서 동일한 캐스팅 문제로 고생을 지적한다. 나는 또한 결정 론적 순서를 시행함에 따라'납'/'지연'을 선호한다. –