计算数据框中跨列的最长连续序列 - 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)
我有一个如下所示的数据框...
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)