在对先前提出的问题进行了出色的回答后-在数据帧内跨因子的所有级别选择n个随机行-我一直在考虑扩展此问题。
先前的问题试图从特定因子的每个级别随机采样n行/观测值,并将所有信息组合到一个新的数据帧中。
但是,这种随机采样对于某些类型的数据可能不是最佳的。在这里,我想再次针对特定因子的每个级别选择n行/观察值。这里的主要区别在于,从特定因子的每个级别选择的行/观察值应该是连续的。
这是一个示例数据集:
id<-sample(1:20, 100, replace = TRUE)
dat<-as.data.frame(id)
color <- c("blue", "red", "yellow", "pink", "green", "orange", "white", "brown")
dat$colors<- sample(color, 100, replace = TRUE)
要添加到此示例的数据集是每个观测值的时间戳。这些将构成我希望采样的顺序。我正在使用此线程中建议的功能-有效地生成两个日期之间的时间和日期的随机样本-为此:
randomts <- function(N, st="2013/12/09", et="2013/12/14") {
st <- as.POSIXct(as.Date(st))
et <- as.POSIXct(as.Date(et))
dt <- as.numeric(difftime(et,st,unit="sec"))
ev <- sort(runif(N, 0, dt))
rt <- st + ev
}
dat$ts<-randomts(100)
我不确定这是否有必要,但是也可以添加一个给出“ day”的变量。这是我希望从各个级别进行抽样的因素。
temp<-strsplit(as.character(dat$ts), " ")
mat<-matrix(unlist(temp), ncol=2, byrow=TRUE)
df<-as.data.frame(mat)
colnames(df)<-c("date", "time")
dat<-cbind(df, dat)
mindate<-as.Date(min(dat$date))
dates<-as.Date(dat$date)
x<-as.numeric(dates-mindate)
x<-x+1
dat$day<-x
as.factor(dat$day) #in this example data there are 6 levels to 'day'.
#EDIT there may be 5 levels to day - depends on how data randomly generated by function
原始帖子无法准确计算出日期。这虽然不完美,但更好。似乎还可以,但是第一天是day = 0,那么它希望是day = 1
总而言之,问题是这样的。我想创建一个新的数据框,其中包含例如从数据框“ dat”的因子日的每个级别中随机采样的5个连续观察值(即每天采集5个随机连续观察值)。因此,新数据框将具有30个观测值。另一个警告是,如果我想采样例如20个连续的观测值,而某个特定级别仅包含15个观测值,则所有15个观测值都将返回并且没有替代值。
我尝试使用seq_along解决此问题。我似乎能够一次将其用于一个变量-例如,如果从颜色采样:
x <- sample(seq_along(dat$colors),1)
dat$colors[x:(x+4)]
这将从可变颜色中随机抽取5种连续颜色的列表。
我很难将其应用于当前的问题。我试图修改我上一个问题的一些答案,在一个数据帧内的因素的所有级别上选择n个随机行-但似乎无法计算出seq_along的正确位置。
这应该假设您data.frame
按日期对颜色进行采样。这N
是您想要每种颜色的数量。返回值keep
将TRUE
针对每个颜色组的运行。
N <- 5
keep <- with(dat, ave(rep(T, nrow(dat)), colors, FUN=function(x) {
start <- sample.int(max(length(x)-N,1),1)
end <- min(length(x), start+N-1)
r <- rep(c(F,T,F), c(start-1, end-start+1, length(x)-end))
}))
dat[keep, ]
此方法不考虑任何day
值。它只是找到随机N
观察结果。如果N
某个特定类别的观察数少于该类别,则每个类别只会返回较少的数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句