2016-06-08 51 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)执行此检查。

相关问题