簡體   English   中英

計算數據幀中跨列的最長連續序列 - R

[英]Calculate Longest Consecutive Sequence Across Columns in a Data Frame - R

我有一個像下面這樣的數據框...

df <- data.frame(B1994 = c(1,0,0,0,1,0,0,1,1,0),
                 B1995 = c(1,1,1,0,0,1,1,1,0,0),
                 B1996 = c(0,0,0,0,0,0,1,1,1,0),
                 B1997 = c(1,0,1,0,0,1,0,1,1,1),
                 B1998 = c(1,0,0,0,1,0,1,0,0,1)
)

我現在正在嘗試計算該數據框中所有列(每行)中最長的連續 0 序列,並用這些值填充一個新列,如下面的這個數據框...

df2 <- data.frame(B1994 = c(1,0,0,0,1,0,0,1,1,0),
                 B1995 = c(1,1,1,0,0,1,1,1,0,0),
                 B1996 = c(0,0,0,0,0,0,1,1,1,0),
                 B1997 = c(1,0,1,0,0,1,0,1,1,1),
                 B1998 = c(1,0,0,0,1,0,1,0,0,1),
                 Longest_0_Interval = c(1,3,1,5,3,1,1,1,1,3)
)

在 R 中有一個簡單的解決方案嗎?

一種dplyr選項可能是:

df %>%
 rowwise() %>%
 mutate(Longest_0_Interval = with(rle(c_across(everything())), max(lengths[values == 0])))

   B1994 B1995 B1996 B1997 B1998 Longest_0_Interval
   <dbl> <dbl> <dbl> <dbl> <dbl>              <int>
 1     1     1     0     1     1                  1
 2     0     1     0     0     0                  3
 3     0     1     0     1     0                  1
 4     0     0     0     0     0                  5
 5     1     0     0     0     1                  3
 6     0     1     0     1     0                  1
 7     0     1     1     0     1                  1
 8     1     1     1     1     0                  1
 9     1     0     1     1     0                  1
10     0     0     0     1     1                  3

您可以使用rle()

df <- data.frame(B1994 = c(1,0,0,0,1,0,0,1,1,0),
                 B1995 = c(1,1,1,0,0,1,1,1,0,0),
                 B1996 = c(0,0,0,0,0,0,1,1,1,0),
                 B1997 = c(1,0,1,0,0,1,0,1,1,1),
                 B1998 = c(1,0,0,0,1,0,1,0,0,1)
)

maxl0 <- function(x) {
  r <- rle(x)
  i0 <- which(r$values==0)  ## or i0 <- r$values==0
  max(r$lengths[i0])
}

df$Longest_0_Interval <- apply(df, 1, maxl0)

暫無
暫無

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

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