2016-06-08 57 views
1

我有一個很大的數據集,我想刪除除1個變量的前8個值之外的所有行。 (在這個例子中只有第一個)刪除除子集中第一行以外的所有內容R

例如集:

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) 

SO:我想刪除除的Subj1 $刺激第1行中的所有行「快樂1」,「快樂2」,「厭惡1" 等 我管理由子集這樣做的一個新的變量,然後取消選擇使用下面的代碼,但第8行的一切:

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

不過,我想對所有自動運行此刺激變量。另一件讓這變得更加困難的事情是,行號因爲刪除了行而跳起來。

謝謝你的幫助!

+0

你說你想刪除所有行「除了第8個......」,但你的示例刪除除第一個以外的所有行。你什麼意思? – 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.tablesetDT(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她的選項是unique,從data.tableby選項。

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得到的第一個觀察。

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

或者使用avebase 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

可以使用基礎R功能duplicated保持刺激水平的第一個實例:

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

我不得不確保刺激不是一個因素,使用stringsAsFactors = F ALSE

數據

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

如果您data.frame被刺激有序的,並且要保留每個的第一M個觀測,你可以使用whichduplicated如下:

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

上面的代碼將選擇每個刺激級別的前三個觀察值。請注意,它不會檢查刺激級別是否有足夠的觀察值。

但是,您可以使用table(Subj1$stimulus)執行此檢查。

相關問題