gpt4 book ai didi

根据周围的值重新编码向量中的值

转载 作者:行者123 更新时间:2023-12-04 10:26:33 26 4
gpt4 key购买 nike

我正在尝试以编程方式更改 0 中的变量到 1如果有三个10 之前和之后.

例如,如果向量中的数字是 1 , 1 , 1 , 0 , 1 , 1 , 和 1 , 然后我想改变 01 .

这是向量 dummy_code 中的数据在data.frame df :

original_df <- data.frame(dummy_code = c(1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1))

这是我尝试重新编码值的方式:

desired_df <- data.frame(dummy_code = c(1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1)

我尝试使用 the function fill in the package tidyr ,但这会填充缺失值,因此它不会起作用。如果我重新编码0缺少值,那么这也不起作用,因为它只会对每个 NA 进行编码作为1 ,当我只想对每个 NA 进行编码时三围1s作为1 .

有没有办法以编程方式高效地执行此操作?

最佳答案

rle 替代方案,使用来自@G 的x。格洛腾迪克的回答:

r <- rle(x)

查找三个 1 的运行索引:

i1 <- which(r$lengths == 3 & r$values == 1)

检查包围 0 的“1 索引”中的哪些,并获取要替换的 0 的索引:

i2 <- i1[which(diff(i1) == 2)] + 1

将相关的0替换为1:

r$values[i2] <- 1

在更新的运行中反转 rle 操作:

inverse.rle(r)
# [1] 1 0 0 1 1 1 1 1 1 1 0 0 1

基于 data.table::rleid 的类似解决方案,稍微更紧凑并且可能更易于阅读:

library(data.table)
d <- data.table(x)

计算每次运行的长度:

d[ , n := .N, by = rleid(x)]

对于为零的“x”和1的前后运行长度为3,将“x”设置为1 :

d[x == 0 & shift(n) == 3 & shift(n, type = "lead") == 3, x := 1]
d$x
# [1] 1 0 0 1 1 1 1 1 1 1 0 0 1

关于根据周围的值重新编码向量中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41925159/

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