gpt4 book ai didi

r - 基于连续值的组变量

转载 作者:行者123 更新时间:2023-12-01 22:04:26 24 4
gpt4 key购买 nike

我有这样一个包含年度数据的数据框,但是,有些年份没有数据(此处:1956 年、1961-1964 年)。

dat <- data.frame(Year = c(1950:1955, 1957:1960, 1965:1970),
Val = 1:16)
> dat
Year Val
1 1950 1
2 1951 2
3 1952 3
4 1953 4
5 1954 5
6 1955 6
7 1957 7
8 1958 8
9 1959 9
10 1960 10
11 1965 11
12 1966 12
13 1967 13
14 1968 14
15 1969 15
16 1970 16

我想添加一个变量“Period”,其中包含每个时期的最小和最大年份,其中一个时期定义为一组连续的年份(即 1950-1955、1957-1960 和 1965-1970)。创建这个变量本身不是问题,但我对如何进行分组感到困惑。有什么想法吗?

dat %>%
...???... %>%
mutate(Period = paste(min(Year), max(Year), sep = "-"))

最佳答案

您可以为连续的时间段创建一个 ID:

dat$cont_per <- cumsum(!c(TRUE, diff(dat$Year)==1))

然后据此计算最小/最大值。例如,使用 :

library(data.table)
setDT(dat)
dat[, Period := paste(min(Year), max(Year), sep="-"), by=cont_per]
dat
# Year Val cont_per Period
# 1: 1950 1 0 1950-1955
# 2: 1951 2 0 1950-1955
# 3: 1952 3 0 1950-1955
# 4: 1953 4 0 1950-1955
# 5: 1954 5 0 1950-1955
# 6: 1955 6 0 1950-1955
# 7: 1957 7 1 1957-1960
# 8: 1958 8 1 1957-1960
# 9: 1959 9 1 1957-1960
# 10: 1960 10 1 1957-1960
# 11: 1965 11 2 1965-1970
# 12: 1966 12 2 1965-1970
# 13: 1967 13 2 1965-1970
# 14: 1968 14 2 1965-1970
# 15: 1969 15 2 1965-1970
# 16: 1970 16 2 1965-1970

注意:您还可以直接计算Period,而无需创建变量cont_per:

setDT(dat)[, Period := paste(min(Year), max(Year), sep="-"), by=cumsum(!c(TRUE, diff(Year)==1))]
head(dat)
# Year Val Period
# 1: 1950 1 1950-1955
# 2: 1951 2 1950-1955
# 3: 1952 3 1950-1955
# 4: 1953 4 1950-1955
# 5: 1954 5 1950-1955
# 6: 1955 6 1950-1955

类似地,使用 :

dat %>% 
group_by(count_per=cumsum(!c(TRUE, diff(dat$Year)==1))) %>%
mutate(Period=paste(min(Year), max(Year), sep="-"))

关于r - 基于连续值的组变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52644455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com