问题描述
我有以下虚拟数据:
data <- data.frame(c("FALSE","FALSE","TRUE","FALSE"))
我想从这些数据中获得的是计算以下几件事:
- n_00:鉴于先前的元素为“ FALSE”,出现“ FALSE”的次数
- n_01:鉴于先前的元素为“ FALSE”,出现“ TRUE”的次数
- n_10:鉴于前一个元素为“ TRUE”,出现“ FALSE”的次数
- n_11:鉴于先前的元素为“ FALSE”,出现“ TRUE”的次数
因此,虚拟数据应提供的结果数字为:
- n_00 = 2
- n_01 = 2
- n_10 = 2
- 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)