2016-07-21 2 views
1

데이터 프레임이 있습니다.R 인접한 블록과 일치하는 서브 세트

dat <- data.frame(k=c("A","A","B","B","B","A","A","A"), 
a=c(4,2,4,7,5,8,3,2),b=c(2,5,3,5,8,4,5,8), 
stringsAsFactors = F) 

    k a b 
1 A 4 2 
2 A 2 5 
3 B 4 3 
4 B 7 5 
5 B 5 8 
6 A 8 4 
7 A 3 5 
8 A 2 8 

변수 k를 기준으로 인접 블록을 부분 집합하고자합니다. 이는 표준 접근 방식입니다.

#using rle rather than levels 
kval <- rle(dat$k)$values 
for(i in 1:length(kval)) 
{ 
    subdf <- subset(dat,dat$k==kval[i]) 
    print(subdf) 
    #do something with subdf 
} 

    k a b 
1 A 4 2 
2 A 2 5 
6 A 8 4 
7 A 3 5 
8 A 2 8 

    k a b 
3 B 4 3 
4 B 7 5 
5 B 5 8 

    k a b 
1 A 4 2 
2 A 2 5 
6 A 8 4 
7 A 3 5 
8 A 2 8 

위의 서브 세트는 분명히 의도 한대로 작동하지 않습니다. 이 결과를 얻는 우아한 방법?

k a b 
1 A 4 2 
2 A 2 5 

k a b 
1 B 4 3 
2 B 7 5 
3 B 5 8 

k a b 
1 A 8 4 
2 A 3 5 
3 A 2 8 
+0

아를 제작하는 base R 옵션입니다! 길이. _facepalm_ 감사합니다! – rmf

답변

2

우리는 만들 data.table에서 rleid를 사용할 수있는 그룹화 변수

library(data.table) 
setDT(dat)[, grp := rleid(k)] 
dat 
# k a b grp 
#1: A 4 2 1 
#2: A 2 5 1 
#3: B 4 3 2 
#4: B 7 5 2 
#5: B 5 8 2 
#6: A 8 4 3 
#7: A 3 5 3 
#8: A 2 8 3 

우리 수에 의해 그룹 'GRP'표준 data.table 방법을 사용하여 'GRP'내에서 모든 작업을한다. 여기


은 'GRP'물론

dat$grp <- with(dat, cumsum(c(TRUE, k[-1]!= k[-length(k)]))) 
관련 문제