R 如何按间隔折叠数据?
我想采用如下数据集:R 如何按间隔折叠数据?,r,R,我想采用如下数据集: dat <- data.frame(pos = 1:120, state = c(rep("state1", 30), rep("state2",30), rep("state3",30), rep("state1", 30))) dat为此,您可以使用dplyr中的groupby。代码如下: require(dplyr) dat1 = dat %>% dplyr::arrange(state,pos) %>% dplyr::mutate(
dat <- data.frame(pos = 1:120, state = c(rep("state1", 30), rep("state2",30), rep("state3",30), rep("state1", 30)))
dat为此,您可以使用dplyr中的groupby
。代码如下:
require(dplyr)
dat1 = dat %>%
dplyr::arrange(state,pos) %>%
dplyr::mutate(occurence=0)
occurence = 0
for(i in 1:nrow(dat1)){
if((i != 1) && ((dat1$pos[i] - dat1$pos[i-1])>1)){
occurence = occurence + 1
}
dat1$occurence[i] = occurence
}
dat2 = dat1 %>%
dplyr::group_by(state,occurence) %>%
dplyr::summarise(start = min(pos,na.rm=T),
end = max(pos,na.rm=T)) %>%
dplyr::arrange(start)
让我知道它是否有效
输出
# A tibble: 4 x 4
# Groups: state [3]
state occurence start end
<fct> <dbl> <int> <int>
1 state1 0 1 30
2 state2 1 31 60
3 state3 1 61 90
4 state1 1 91 120
使用base R,您可以使用rle
:
with( rle(as.character(dat$state)),
data.frame(state=values,end = cumsum(head(lengths))->end,start = c(1,head(end,-1)+1)))
state end start
1 state1 30 1
2 state2 60 31
3 state3 90 61
4 state1 120 91
对不起,我意识到我输入的是“state”而不是“state1”。变量.@Sergio.pv应该只有三个级别,所以在输出中,您希望“state1”出现两次?确切地说,我想知道是什么inbetween@Sergio.pv,我添加了一个for循环来检查'occurrence',它本质上是特定状态
的一个块的出现,然后我按状态
和发生
进行分组。您试图得到的输出是什么?您的问题是否未包含在您的分组列中?state=c(“state1”、“state2”、“state3”、“state1”)
中,state1
和state1之间有什么区别?没有区别,我想知道它在数据中的位置
dat2 = dat2 %>% dplyr::select(-occurence)
with( rle(as.character(dat$state)),
data.frame(state=values,end = cumsum(head(lengths))->end,start = c(1,head(end,-1)+1)))
state end start
1 state1 30 1
2 state2 60 31
3 state3 90 61
4 state1 120 91