gpt4 book ai didi

r - 根据另一个向量中的数据 block 分配一个二进制向量

转载 作者:行者123 更新时间:2023-12-02 08:12:19 25 4
gpt4 key购买 nike

我有一个数据框:

dat <- data.frame(diffsecs=(c(189, 245, 13988, 2396, 29601, 263, 297, 292, 230, 257, 192, 
286, 236, 261, 286, 268, 294, 260, 286, 299, 514, 2287, 234,
195, 250, 519, 560, 3314, 12340, 186, 184, 180, 180, 180, 180,
180, 180, 180, 180, 180, 3072, 180, 180, 206, 180, 180, 180,
360, 180, 180, 180, 180, 5220, 180, 437, 246, 218, 212, 472,
2356, 2641, 363, 425, 757, 403, 181, 355, 192, 192, 784, 238,
250, 261, 272, 2554, 29524, 4482, 6762, 1252, 269, 303, 294,
286, 273, 289, 274, 216, 255, 180, 252, 322, 238, 583, 289, 317,
308, 305, 308, 312, 330)))

它有实例 block ,其中有多个连续行等于 180。我想分配一个二元向量,当 diffsecs 的值等于 180 时它等于 1,否则为 0。但是,我只希望它在包含 5 个或更多 180 的连续实例的 block 中等于 1。因此,如果有 3 个连续的 180 值,二进制向量将等于 0。

我试过使用循环

total<- nrow(dat)
len<- 1:total

for(i in len){
temp<- dat[i:(i+5),]
xdiff<- ifelse(mean(temp$diffsecs)>178 & mean(temp$diffsecs)<182 ,1,0)
temp2<- cbind(dat[i,],xdiff)
if(i==1) {dat2 <- temp2}
else {dat2<- rbind(dat2,temp2)}

}

但它不管理它并分配比要求更短的 block 。

最佳答案

您可以利用出色的 rle 函数及其逆函数:

RLE <- rle(dat$diffsecs)
RLE$values <- ifelse(RLE$values == 180 & RLE$lengths >= 5,1,0)
dat2 <- cbind(dat,binarycol=inverse.rle(RLE))

正如@Frank 正确指出的那样,您可以将第二行缩短为:

RLE$values <- as.integer(RLE$values == 180 & RLE$lengths >= 5)

甚至:

RLE$values <- RLE$values == 180 & RLE$lengths >= 5

如果 FALSE/TRUE 向量代替 0/1

关于r - 根据另一个向量中的数据 block 分配一个二进制向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45464333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com