如何计算数据框中TRUE语句的数量,条件是前一个元素在R中也为TRUE?

问题描述

我有以下虚拟数据:

data <- data.frame(c("FALSE","FALSE","TRUE","FALSE"))

我想从这些数据中获得的是计算以下几件事:

  1. n_00:鉴于先前的元素为“ FALSE”,出现“ FALSE”的次数
  2. n_01:鉴于先前的元素为“ FALSE”,出现“ TRUE”的次数
  3. n_10:鉴于前一个元素为“ TRUE”,出现“ FALSE”的次数
  4. n_11:鉴于先前的元素为“ FALSE”,出现“ TRUE”的次数

因此,虚拟数据应提供的结果数字为:

  1. n_00 = 2
  2. n_01 = 2
  3. n_10 = 2
  4. n_11 = 2

如果已经看到并试图改编用于类似问题的方法,这些问题涉及运行或计数连续参数,但没有成功。

本质上,我想做的是根据前一个元素计算满足条件的元素的数量。

如果任何人都知道一个页面,可以提出一个函数或循环,那将不胜感激,因为我想使用大量数据来做到这一点。

解决方法

您可以只使用table来将值与滞后值进行比较:

table(previous = data[[1]][-1],current = data[[1]][-nrow(data)])
#>         current
#> previous FALSE TRUE
#>    FALSE     2    2
#>    TRUE      2    2

或者,如果您想花哨:

as.data.frame(table(previous = data[[1]][-1],current = data[[1]][-nrow(data)]))
#>   previous current value
#> 1    FALSE   FALSE     2
#> 2     TRUE   FALSE     2
#> 3    FALSE    TRUE     2
#> 4     TRUE    TRUE     2
,

如何在向量上编写一个简单的循环以计算对的类型?

x <- c(FALSE,FALSE,TRUE,FALSE)

count_chunks <- function(x) {
  out <- NULL
  for (i in 2:length(x)) {
    out <- c(out,paste(x[i-1],x[i]))
  }
  table(out)
}

count_chunks(x)
#> out
#> FALSE FALSE  FALSE TRUE  TRUE FALSE   TRUE TRUE 
#>           2           2           2           2
,

根据数据的大小,循环方法可能会变慢。这是一种dplyr方法。可能不如使用table()快。

data <- data.frame( var = c("FALSE","FALSE","TRUE","FALSE"))
data$var <- as.logical(data$var)
data %>% 
   mutate(lag = lag(var)) %>%
   group_by(var,lag) %>%
   filter(complete.cases(lag)) %>%
   summarise(count = n()) %>%
   mutate(label = paste("n_",as.numeric(var),as.numeric(lag),sep ="")) %>%
   select(label,count)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...