수색…


비고

런은 반복되는 값 또는 관측 시퀀스입니다. 반복되는 값의 경우, R의 "run-length encoding"은 실행 측면에서 벡터를 간결하게 설명합니다. 중히 여기다:

dat <- c(1, 2, 2, 2, 3, 1, 4, 4, 1, 1)

우리는 길이 1의 1 초를 갖는다; 그 다음 2 초의 길이 3 행; 그 다음 3 초의 길이 - 1 행; 등등. R의 런 길이 인코딩은 벡터의 모든 길이와 값을 캡처합니다.

확장 프로그램

실행은 표 형식의 데이터에서 연속적인 관측을 참조 할 수도 있습니다. R이를 인코딩하는 자연적인 방법을 가지고 있지 않지만, 그들은 함께 처리 할 수 rleid data.table 패키지 (현재 막 다른 링크)에서 .

`rle '을 사용한 런 - 길이 인코딩

런 길이 인코딩은 벡터에서 연속 요소의 런 길이를 캡처합니다. 예제 벡터를 생각해보십시오.

dat <- c(1, 2, 2, 2, 3, 1, 4, 4, 1, 1)

rle 함수는 각 실행과 길이를 추출합니다.

r <- rle(dat)
r
# Run Length Encoding
#   lengths: int [1:6] 1 3 1 1 2 2
#   values : num [1:6] 1 2 3 1 4 1

각 실행에 대한 값은 r$values 캡처 r$values .

r$values
# [1] 1 2 3 1 4 1

이것은 우리가 처음으로 1의 런을 본 다음 2의 런을 실행 한 다음 3을 실행 한 다음 1을 실행하는 것을 포착합니다.

각 실행의 길이는 r$lengths 로 캡처됩니다.

r$lengths
# [1] 1 3 1 1 2 2

1의 초기 실행은 길이 1이었고, 2의 실행은 길이 3이었습니다.

베이스 R에서 런별 식별 및 그룹화

변수를 실행하여 데이터를 그룹화하고 일종의 분석을 수행하고자 할 수 있습니다. 다음과 같은 간단한 데이터 세트를 고려하십시오.

(dat <- data.frame(x = c(1, 1, 2, 2, 2, 1), y = 1:6))
#   x y
# 1 1 1
# 2 1 2
# 3 2 3
# 4 2 4
# 5 2 5
# 6 1 6

변수 x 는 길이가 2이고 값이 1이고 길이가 3이고 값이 2이고 길이가 1 인 값이 1입니다. 각 변수의 y 값의 평균값을 계산할 수 있습니다. 변수 x 실행 (이 평균값은 1.5, 4 및 6 임).

base R에서, 우리는 먼저 rle 사용하여 x 변수의 run-length 인코딩을 계산할 것입니다.

(r <- rle(dat$x))
# Run Length Encoding
#   lengths: int [1:3] 2 3 1
#   values : num [1:3] 1 2 1

다음 단계는 데이터 집합의 각 행의 실행 수를 계산하는 것입니다. 우리는 총 실행 횟수가 length(r$lengths) 이고 각 실행의 길이가 r$lengths 라는 것을 알고 있기 때문에 각 실행의 실행 횟수를 rep 계산할 수 있습니다.

(run.id <- rep(seq_along(r$lengths), r$lengths))
# [1] 1 1 2 2 2 3

이제 tapply 를 사용하여 실행 ID를 그룹화하여 각 실행에 대한 평균 y 값을 계산할 수 있습니다.

data.frame(x=r$values, meanY=tapply(dat$y, run.id, mean))
#   x meanY
# 1 1   1.5
# 2 2   4.0
# 3 1   6.0

data.table에서 run으로 식별 및 그룹화

data.table 패키지는 데이터에서 런별로 그룹화하는 편리한 방법을 제공합니다. 다음 예제 데이터를 고려하십시오.

library(data.table)
(DT <- data.table(x = c(1, 1, 2, 2, 2, 1), y = 1:6))
#    x y
# 1: 1 1
# 2: 1 2
# 3: 2 3
# 4: 2 4
# 5: 2 5
# 6: 1 6

변수 x 는 길이가 2이고 값이 1이고 길이가 3이고 값이 2이고 길이가 1 인 값이 1입니다. 각 변수의 y 값의 평균값을 계산할 수 있습니다. 변수 x의 실행 (이 평균값은 1.5, 4 및 6 임).

data.table rleid 함수는 벡터의 각 요소의 실행 ID를 나타내는 ID를 제공합니다.

rleid(DT$x)
# [1] 1 1 2 2 2 3

그러면이 실행 ID를 쉽게 그룹화하고 y 데이터를 요약 할 수 있습니다.

DT[,mean(y),by=.(x, rleid(x))]
#    x rleid  V1
# 1: 1     1 1.5
# 2: 2     2 4.0
# 3: 1     3 6.0

벡터 압축 및 압축 해제를위한 런 길이 인코딩

동일한 값의 long run을 가진 긴 벡터는 run-length encoding (각 run의 값과 그 값이 반복되는 횟수)에 저장함으로써 상당히 압축 될 수 있습니다. 예를 들어, 1의 막대한 수와 0의 작은 수를 가진 길이가 1,000 만인 벡터를 생각해보십시오 :

set.seed(144)
dat <- sample(rep(0:1, c(1, 1e5)), 1e7, replace=TRUE)
table(dat)
#       0       1 
#     103 9999897 

1 천만 개의 항목을 저장하려면 상당한 공간이 필요하지만 대신이 벡터의 런 길이 인코딩을 사용하여 데이터 프레임을 만들 수 있습니다.

rle.df <- with(rle(dat), data.frame(values, lengths))
dim(rle.df)
# [1] 207   2
head(rle.df)
#   values lengths
# 1      1   52818
# 2      0       1
# 3      1  219329
# 4      0       1
# 5      1  318306
# 6      0       1

런 - 랭스 인코딩에서 벡터의 처음 52,818 값은 1이고, 그 다음에는 단일 0, 219,329 연속 1, 0 등이있는 것을 볼 수 있습니다. run-length 인코딩에는 207 개의 항목 만 있으므로 1000 만 개의 값 대신 414 개의 값만 저장하면됩니다. rle.df 는 데이터 프레임이므로 write.csv 와 같은 표준 함수를 사용하여 저장할 수 있습니다.

런 - 렝쓰 인코딩에서 벡터를 압축하는 것은 두 가지 방법으로 수행 될 수있다. 첫 번째 방법은 rep 호출하여 첫 ​​번째 인수로 run-length 인코딩의 values 요소를 전달하고 두 번째 인수로 run-length 인코딩의 lengths 요소를 전달하는 것입니다.

decompressed <- rep(rle.df$values, rle.df$lengths)

압축 해제 된 데이터가 원래 데이터와 동일하다는 것을 확인할 수 있습니다.

identical(decompressed, dat)
# [1] TRUE

두 번째 방법은 사용하는 것입니다 R의 내장 inverse.rle 온 기능 rle 예를 들어 객체 :

rle.obj <- rle(dat)                            # create a rle object here
class(rle.obj)
# [1] "rle"

dat.inv <- inverse.rle(rle.obj)               # apply the inverse.rle on the rle object

우리는 이것이 정확히 원래의 dat 생성한다는 것을 다시 확인할 수 있습니다 :

identical(dat.inv, dat)
# [1] TRUE


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow