簡體   English   中英

從 R 中 n 個連續值不為 0 的向量創建向量列表

[英]Create a list of vectors from a vector where n consecutive values are not 0 in R

所以我有這個向量:

a = sample(0:3, size=30, replace = T)
 [1] 0 1 3 3 0 1 1 1 3 3 2 1 1 3 0 2 1 1 2 0 1 1 3 2 2 3 0 1 3 2

我想要的是一個向量列表,其中包含由 n 0 分隔的所有元素。 所以在這種情況下,n = 0(連續值之間不能有任何 0),這將給出:

res = c([1,3,3], [1,1,1,3,3,2,1,1,3], [2,1,1,2]....)

但是,如果我將其設置為 2,我想靈活地控制 n 參數,例如:

b = c(1,2,0,3,0,0,4)

仍然會導致這樣的結果

res = c([1,2,3],[4])

在嘗試計算 0 的數量時,我嘗試了很多使用 for 循環中的 while 循環的方法。 但我就是無法實現。

更新

我試圖在此處以更真實的設置發布問題: 根據 R 中另一列中的連續計數靈活計算列

謝謝大家的幫助。 以我有限的知識,我似乎無法將您的幫助付諸實踐。

這是一個基本的 R 選項,在一般情況下使用rle + split ,即b中的值不限於03

with(
  rle(with(rle(b == 0), rep(values & lengths == n, lengths))),
  Map(
    function(x) x[x != 0],
    unname(split(b, cut(seq_along(b), c(0, cumsum(lengths))))[!values])
  )
)

這給出(假設n=2

[[1]]
[1] 1 2 3

[[2]]
[1] 4

如果您的值在 ragne 09之間,您可以嘗試下面的代碼

lapply(
  unlist(strsplit(paste0(b, collapse = ""), strrep(0, n))),
  function(x) {
    as.numeric(
      unlist(strsplit(gsub("0", "", x), ""))
    )
  }
)

這也給出了

[[1]]
[1] 1 2 3

[[2]]
[1] 4

我還想用 DescTools 的 function SplitAt粘貼一個有用的解決方案:

SplitAt(a, which(a==0)) %>% lapply(., function(x) x[which(x != 0)])

其中 a 是您的初始向量。 它為您提供了一個列表,其中每個條目都包含零之間的一對數字:

第一個解決方案

如果您添加另一個帶有空字符的 SplitAt,您可以在子列表之后創建子列表並將其拆分為任意數量的子列表:例如:

n <- 4
SplitAt(a, which(a==0)) %>% lapply(., function(x) x[which(x != 0)]) %>% SplitAt(., n)

給你:

在此處輸入圖像描述

set.seed(1)
a <- sample(0:3, size=30, replace = T)
a
[1] 0 3 2 0 1 0 2 2 1 1 2 2 0 0 0 1 1 1 1 2 0 2 0 0 0 0 1 0 0 1

a2 <- paste(a, collapse = "") # Turns into a character vector, making it easier to handle patterns.
a3 <- unlist(strsplit(a2, "0")) # Change to whatever pattern you want, like "00".
a3 <- a3[a3 != ""] # Remove empty elements
a3 <- as.numeric(a3) # Turn back to numeric
a3
[1]     32      1 221122  11112      2      1      1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM