2016-06-08 5 views
1

1 개의 변수 값 당 처음 8 개를 제외한 모든 행을 제거하려는 큰 데이터 집합이 있습니다. (이 예제의 첫 번째 일)하위 집합의 첫 번째 행을 제외하고 모든 행을 제거합니다. R

예 세트 : SO

Time <- c(1:20) 
    stimulus <- c(rep("happy 1",4),rep("happy 2",4),rep("disgust 1",4),rep("anger 1",4),rep("sad 1",4)) 
    Happy <- c(runif(20,0,1)) 
    Disgust <- c(runif(20,0,1)) 
    Anger <- c(runif(20,0,1)) 
    Subj1<- data.frame(Time,stimulus,Happy,Disgust,Anger) 

: 나는의 Subj1 $ 자극 첫째 행을 제외한 모든 행을 제거 할 "행복 1", "행복 2", " 나는 자동으로 모든이를 실행하려는 그러나

Stim1<-which(Subj1$stimulus=="happy 1") 
Subj1<- Subj1[-c(Stim1[2:length(Stim1)]),] 

: 등 혐오 1 " 나는 새로운 변수로 부분 집합에 의해 그렇게하도록 관리하고 해제 선택 다음 코드를 사용하여 첫 번째 8 개 행을 제외한 모든 자극 변수. 이 작업을 더 어렵게 만드는 또 다른 이유는 행을 제거했기 때문에 행 번호가 이동하기 때문입니다.

도움 주셔서 감사합니다. 우리는 각각의 '자극'에 따라 첫 번째 행을 제거해야하는 경우

+0

"처음 8 개를 제외하고 모든 행을 제거하고 싶습니다 ..."라고 말하면 첫 번째 ONE을 제외한 모든 행이 제거됩니다. 무슨 소리 야? – Zelazny7

+0

또는 http://stackoverflow.com/questions/13279582/select-only-the-first-rows-for-each-unique-value-of-a-column-in-r – Jaap

답변

1

data.table 하나의 옵션은 우리가 처음 관찰을 제거, '자극'로 그룹화 data.table (setDT(Subj1))로 변환하는 것입니다 tail

library(data.table) 
setDT(Subj1)[, tail(.SD,-1), by = stimulus] 

또는 우리가 첫 번째 관찰을 필요로하는 경우, head

setDT(Subj1)[, head(.SD,1), by = stimulus] 
# stimulus Time  Happy  Disgust  Anger 
#1: happy 1 1 0.2721827 0.263906233 0.3218399 
#2: happy 2 5 0.6649942 0.006288805 0.4758943 
#3: disgust 1 9 0.4102272 0.275845885 0.6631558 
#4: anger 1 13 0.2924157 0.776806617 0.8609168 
#5:  sad 1 17 0.1599896 0.010758160 0.6081846 

또는 anot를 사용 그녀의 옵션은 uniquedata.table에서 by 옵션입니다.

unique(setDT(Subj1), by = "stimulus") 
# Time stimulus  Happy  Disgust  Anger 
#1: 1 happy 1 0.2721827 0.263906233 0.3218399 
#2: 5 happy 2 0.6649942 0.006288805 0.4758943 
#3: 9 disgust 1 0.4102272 0.275845885 0.6631558 
#4: 13 anger 1 0.2924157 0.776806617 0.8609168 
#5: 17  sad 1 0.1599896 0.010758160 0.6081846 

dplyr 옵션은 '자극'에 의해 그룹이 될 것이며 slice에 처음 관찰을 얻을.

newdf <- Subj1[!duplicated(Subj1$stimulus), ] 

I가 있었다 :

library(dplyr) 
Subj1 %>% 
    group_by(stimulus) %>% 
    slice(1) 

또는 base R

Subj1[with(Subj1, ave(seq_along(stimulus), stimulus, FUN = seq_along)==1),] 
+0

나는 dplyr 옵션을 좋아하지만 OP는 처음 8 행을 요구하지 않습니까? 슬라이스 (8)? – BarkleyBG

+0

예, 예를 들면 1 –

+0

@ J.Jansen 내 솔루션에 문제가 있습니까? 나는 먼저 그것을 게시했고 기본 R 옵션도 가지고있다. – akrun

1

에서 ave 사용하면 자극 수준의 첫 번째 인스턴스를 유지하기 위해 기본 R 기능 duplicated을 사용할 수 있습니다 자극이 요인이 아니 었는지 확인하십시오. stringsAsFactors = F 합니다 alse

데이터

Subj1<- data.frame(Time,stimulus,Happy,Disgust,Anger, stringsAsFactors = FALSE) 

당신의 data.frame는 다음과 같이 duplicatedwhich을 사용할 수, 자극에 의해 주문, 당신은 각각의 첫 번째 m 관측을 유지하려는 경우 :

# get rows to include 
myRows <- c(sapply(which(duplicated(Subj1$stimulus)), function(i) i:(i+2))) 
# subset 
newdf <- Subj1[myRows, ] 

위의 코드는 각 자극 수준의 처음 세 가지 관찰을 선택합니다. 자극 수준에서 충분한 관찰이 있는지 확인하지 못한다는 단점이 있습니다.

그러나이 검사는 table(Subj1$stimulus)을 사용하여 수행 할 수 있습니다.