我有一个大型数据集,我希望删除除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)]),]
但是,我想为所有刺激变量自动运行此操作。另一件让事情变得更加困难的事情是因为删除行而导致行号跳跃。
感谢您的帮助!
答案 0 :(得分: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
或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)
执行此检查。