对R Dataframe 的行中的值的连续出现进行计数

bkkx9g8r  于 2023-03-27  发布在  其他
关注(0)|答案(3)|浏览(133)

我想在R Dataframe 的行中计数连续出现的次数,只要第一列取该值,并将结果保存在一个新变量中。如果这是我的数据,并且我对1的值感兴趣:

df <- data.frame(
  A = c(1, 0, 1, 0, 1),
  B = c(0, 0, 1, 1, 1),
  C = c(1, 1, 0, 1, 1),
  D = c(0, 1, 0, 0, 1),
  E = c(1, 0, 1, 0, 0)
)

我想创建以下输出:

df <- data.frame(
  A = c(1, 0, 1, 0, 1),
  B = c(0, 0, 1, 1, 1),
  C = c(1, 1, 0, 1, 1),
  D = c(0, 1, 0, 0, 1),
  E = c(1, 0, 1, 0, 0),
  count = c(1, 0, 2, 0, 4)
)

我尝试了这样的方法,但不确定这是否合理:

df$count <- apply(df[, sapply(df, is.numeric)], 1, function(x) {
  r <- rle(x == 1)
  max(r$lengths[r$values])
})

而且它也还没有考虑到我对从第一列开始的法术感兴趣。任何帮助都非常感谢!

lrl1mhuk

lrl1mhuk1#

library(tidyverse)

df <- tibble(
  A = c(1, 0, 1, 0, 1),
  B = c(0, 0, 1, 1, 1),
  C = c(1, 1, 0, 1, 1),
  D = c(0, 1, 0, 0, 1),
  E = c(1, 0, 1, 0, 0)
)

df |> 
  rowwise() |>
  mutate(count = if_else(A ==1, 
                         sum(consecutive_id(c_across(everything())) == 1),
                         0))
#> # A tibble: 5 × 6
#> # Rowwise: 
#>       A     B     C     D     E count
#>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1     1     0     1     0     1     1
#> 2     0     0     1     1     0     0
#> 3     1     1     0     0     1     2
#> 4     0     1     1     0     0     0
#> 5     1     1     1     1     0     4

创建于2023-03-22带有reprex v2.0.2
使用match()代替consecutive_id()的替代解决方案:

df |> 
  rowwise() |> 
  mutate(count = match(FALSE, c_across(everything()) == 1) - 1)

如果不想使用rowwise(),可以转置 Dataframe :

df |> 
  t() |> 
  as_tibble() |> 
  summarize(across(everything(), \(x) match(FALSE, x == 1) - 1)) |> 
  set_names(colnames(df))
#> # A tibble: 1 × 5
#>       A     B     C     D     E
#>   <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1     1     0     2     0     4
yqlxgs2m

yqlxgs2m2#

使用rle

cbind(df, count = apply(df, 1, function(x) 
  ifelse(x[1] == 1, max(rle(x)$lengths), 0)))
  A B C D E count
1 1 0 1 0 1     1
2 0 0 1 1 0     0
3 1 1 0 0 1     2
4 0 1 1 0 0     0
5 1 1 1 1 0     4
41zrol4v

41zrol4v3#

另一种方式使用游程编码(rle)和“整洁”符号:

df |>
  rowwise() |>
  mutate(first_runlength = unlist(rle(c_across(A:E)))[1],
         first_runlength = ifelse(A, first_runlength, 0)
         )

相关问题