我以這種方式有一個 0 和 1 的序列:
xx <- c(1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1)
我想制作一個向量來累積零的連續性并將累積的連續性添加到下一個可能的值 1。這個特定向量的結果應該是:
yy <- c(1, 1, 1, 0, 0, 3, 0, 2, 0, 0, 0, 4)
在 R 中執行此操作的最快和最有效的方法是什么?
uj5u.com熱心網友回復:
這個基本的 R 實作可能不是最有效的實作,因此如果其他人提出答案,比較性能會很有趣。
代碼
idx_add <- which(xx == 1 & c(NA, xx[-length(xx)]) == 0)
xx_rle <- rle(xx)
n_add <- xx_rle$lengths[xx_rle$values == 0]
yy <- xx
yy[idx_add] <- yy[idx_add] n_add
解釋
idx_add <- which(xx == 1 & c(NA, xx[-length(xx)]) == 0)
這一行找到了xx我們將添加到的索引。這些是我們1前面至少有一個的地方0。所以我們得到c(6, 8, 12).
xx_rle <- rle(xx)
這里我們使用rle()(run-length encoding) 函式來獲取向量中所有連續值的條紋的長度xx。xx_rle有兩個元素,lengths,條紋的長度;和values,它們的值(1s 和0s)。
n_add <- xx_rle$lengths[xx_rle$values == 0]
在這里,我們僅提取零條紋的條紋長度。
yy <- xx
yy[idx_add] <- yy[idx_add] n_add
現在創建一個副本xx并將零連續長度添加到連續之后的第一個長度1。這給出了您想要的結果!
uj5u.com熱心網友回復:
一種base R解決方案可能是:
with(rle(xx), rep(values c(0, head(lengths * (values == 0), -1)), lengths))
[1] 1 1 1 0 0 3 0 2 0 0 0 4
uj5u.com熱心網友回復:
使用dplyr:
資料:
xx <- c(1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 1)
代碼:
yy <- as.data.frame(xx) %>%
mutate(group = ifelse(xx != 0, 1, 0),
group = cumsum(group) 1,
group = ifelse(xx != 0, 0, group)) %>%
group_by(group) %>%
mutate(group = n() 1) %>%
ungroup() %>%
mutate(yy = ifelse(xx != 0 & lag(xx) == 0, lag(group), xx),
yy = ifelse(is.na(yy),xx,yy)) %>%
select(yy) %>%
pull()
輸出:
[1] 1 1 1 0 0 3 0 2 0 0 0 4
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325706.html
上一篇:有沒有辦法在合并函式中使用向量?
下一篇:如何將資料添加到物件的串列中?
