如何在R中自动查找给定数据集中最大断点的起点
我试图找到给定数据的最大断点的起点。以下是我的例子:如何在R中自动查找给定数据集中最大断点的起点,r,R,我试图找到给定数据的最大断点的起点。以下是我的例子: data <- data.frame(month = c(1:12), countx = c(60,69,10,13,65,80,59,84,43,21,18,10)) select <- data[data$countx >= 50,] #take value greater than 50 into account # find the break wtym <- select$mo
data <- data.frame(month = c(1:12), countx = c(60,69,10,13,65,80,59,84,43,21,18,10))
select <- data[data$countx >= 50,] #take value greater than 50 into account
# find the break
wtym <- select$month
breaks <- c(0, which(diff(wtym) != 1), length(wtym))
allbreak <- sapply(seq(length(breaks) - 1 ),
function(i) wtym[(breaks[i] + 1):breaks[i+1]])
> allbreak
[[1]]
[1] 1 2
[[2]]
[1] 5 6 7 8
data听起来像是一个运行长度编码?rle
任务,在该任务中,您要查找x<50
和x>=50
的运行。这里有一个函数:
bigbreak <- function(x, cutoff) {
r <- rle(x >= cutoff)
cumsum(r$l)[which(r$l == max(r$l[r$v]) & r$v)-1]+1
}
bigbreak(data$countx, 50)
#[1] 5
bigbreak使用dplyr
和data.table
的解决方案
# Create example data frame
data <- data.frame(month = c(1:12), countx = c(60,69,10,13,65,80,59,84,43,21,18,10))
# Load package
library(dplyr)
library(data.table)
# Process the data
data2 <- data %>%
mutate(Condition = countx >= 50) %>%
mutate(RunID = rleid(Condition)) %>%
filter(Condition) %>%
group_by(RunID) %>%
mutate(num = n()) %>%
ungroup() %>%
filter(num == max(num))
# Show the number of the first month
data2$month[1]
[1] 5
#创建示例数据帧
数据=50)%>%
突变(RunID=rleid(条件))%>%
过滤器(条件)%>%
分组依据(RunID)%>%
变异(num=n())%>%
解组()%>%
过滤器(num==max(num))
#显示第一个月的编号
数据2$month[1]
[1] 5
什么是wtym
?对不起,我从原始代码中编辑了一点,因此少了一行。上面是编辑的。谢谢,太好了。似乎是我需要的。但当我运行时,我收到消息“max(n)中的错误:参数的“type”(closure)无效”。你没有相同的消息吗?请查看我的更新。R可能会因为列名n
和函数n()
相似而混淆。我将列名从n
更改为num
。再试一次,看看是否有帮助。太棒了!非常感谢你。实际上,我运行了大量数据集(大约1000个单个文件),但是来自一个文件的每个结果都有两列数据框(例如)。所以,如果解决了一个文件,我可以将它们放入一个循环来执行所有操作。谢谢你,有收获了。
# Create example data frame
data <- data.frame(month = c(1:12), countx = c(60,69,10,13,65,80,59,84,43,21,18,10))
# Load package
library(dplyr)
library(data.table)
# Process the data
data2 <- data %>%
mutate(Condition = countx >= 50) %>%
mutate(RunID = rleid(Condition)) %>%
filter(Condition) %>%
group_by(RunID) %>%
mutate(num = n()) %>%
ungroup() %>%
filter(num == max(num))
# Show the number of the first month
data2$month[1]
[1] 5