从子集R中删除除第一行之外的所有内容

时间:2016-06-08 16:50:59

标签: r dataframe subset which

我有一个大型数据集,我希望删除除1个变量的前8个值之外的所有行。 (在这个例子中只是第一个)

示例集:

   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 $ stimulus第一行&#34; happy 1&#34;,&#34; happy 2&#34;,&#34; disgust 1&#34;等等 我设法通过子集化到一个新变量,然后使用以下代码取消选择除前8行之外的所有内容:

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

但是,我想为所有刺激变量自动运行此操作。另一件让事情变得更加困难的事情是因为删除行而导致行号跳跃。

感谢您的帮助!

2 个答案:

答案 0 :(得分: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

unique的另一个选项data.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进行第一次观察。

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

或使用ave

中的base R
Subj1[with(Subj1, ave(seq_along(stimulus), stimulus, FUN = seq_along)==1),]

答案 1 :(得分:1)

您可以使用基本R函数duplicated来保持刺激级别的第一个实例:

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

我必须确保刺激不是一个因素,使用stringsAsFactors = FALSE

数据

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

如果您的data.frame按刺激排序,并且您希望保留每个数据的前m个观察值,则可以which使用duplicated,如下所示:

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

上面的代码将选择每个刺激等级的前三个观察值。请注意,它不会检查刺激水平是否有足够的观察结果。

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