Barton tctcab 不需要穷举,简单说我是想直接在现有数据里面提取所有的连续时段。 比如数据中有3个1950,4个1951,2个1952,3个1953,1个1954. 那就应该提取出两个连续时段 1:1950,1951,1952,1953,1954 2:1950,1951,1952,1953
tctcab Barton 不懂,能说再明白一点吗,比如 1950, 1951 1950, 1951,1952 跟你提的两个连续时间段有什么区别? 而且有三个1950的话, 1:1950,1951,1952,1953,1954 2:1950,1951,1952,1953 每个连续时间段在1950这个数据点就有三个种了,要不要区分数据点
Barton tctcab 就是版主最后理解的那个意思了 “而且有三个1950的话, 1:1950,1951,1952,1953,1954 2:1950,1951,1952,1953 每个连续时间段在1950这个数据点就有三个种了” 刚刚是我写掉了一个结果 “比如数据中有3个1950,4个1951,2个1952,3个1953,1个1954. 那就应该提取出三个连续时段 1:1950,1951,1952,1953,1954 2:1950,1951,1952,1953 3:1950,1951”
Barton tctcab 不适用的 对于结果2:2:1950,1951,1952,1953 虽然整体数据中有1954,但是其只有一个,已经在结果一中被提取了。所以,当提取结果2时,到1953后续就没有1954了,所以,连续时段到此结束。 同理结果3,1952一共只有两个,已被结果1和2 提取,提取结果3时,已经没有更多的1952,所以连续时段到此结束
Barton tctcab 我今天想了一下,其实我想要到达的目的,仍然是分类。 所以,我只是想把连续的时段分为一类。 如版主所举例:1 1 1 2 2 2 3 只需要提取 123 12 12 至于1和2之间的多种组合问题,本来是想根据后面的坐标,按距离远近进行进行判断,但是目前感觉已经都复杂了,所以推而求其次。 只需要把1 1 1 2 2 2 3,分成三类就好,不用考虑各数之间的组合问题。 (通俗点描述,就是样本数是一定的,每提取一个序列,类似于在做不放回抽样。所以可以忽略数与数之间的组合问题)
tctcab Barton 搞定,顺便做了个图 library(tidyverse) df = data.table::fread( "1950 86.02 40.81 1950 76.98 38.70 1951 83.16 40.54 1951 89.95 41.60 1951 76.66 38.69 1952 81.01 39.67 1953 81.04 39.46 1954 82.30 41.33 1954 84.75 41.75 1954 83.55 38.90 1954 77.31 38.69 1954 81.05 38.15 1955 83.61 41.96 1955 81.61 41.11 1955 83.83 39.08 1955 77.25 38.75 1955 80.65 38.15 1957 79.38 39.75 1958 83.50 41.50 1959 82.84 41.34 1960 90.50 42.00 1960 76.72 39.15 1960 79.58 39.58 1962 87.82 39.49 1964 85.06 41.62 1967 85.25 41.49 1967 76.25 39.92 1967 77.39 38.75 1968 85.51 41.36 1969 85.92 41.14 1969 76.75 39.45 1970 83.33 40.58 1971 83.69 40.28 1972 87.12 42.21 1972 79.08 39.92 1972 76.46 39.25 1972 83.25 39.08 1972 81.50 37.00 1973 76.04 39.13 1973 84.64 40.82 1974 75.84 39.43 1975 76.53 39.00 1976 84.79 41.89 1977 84.53 41.92 1978 79.54 38.63 1979 83.58 40.25 1980 83.03 39.63 1981 76.20 38.62 1981 79.95 37.05 1982 75.58 38.88 1984 81.19 40.39 1984 83.08 39.08 1985 80.73 38.64 1986 85.51 40.44 1987 83.50 41.63 1987 80.58 40.42 1987 76.62 39.05 1988 87.25 41.08 1988 76.75 39.20 1989 83.35 41.75 1990 78.89 39.29 1990 87.45 41.05 1991 87.45 41.05 1992 83.86 41.86 1992 87.75 40.68 1992 81.25 40.75 1992 79.14 39.58 1992 76.58 39.75 1993 79.45 39.35 1994 85.00 40.96 1994 79.25 39.03 1995 80.48 39.78 1995 86.45 40.85 1995 83.38 38.63 1996 84.46 41.38 1996 81.00 40.50 1996 79.89 38.25 1997 78.92 38.97 1997 86.39 40.89 1998 83.33 39.29 1999 76.41 38.51 1999 87.00 41.00 1999 81.08 40.25 1999 79.70 38.25 2000 78.07 38.77 2000 85.99 41.15 2000 90.03 41.19 2000 88.36 38.31 2000 82.25 37.93" ) df.filt =df[-(which(diff(df$V1) > 1) + 1),] df.filt %>% arrange(V1) %>% group_by(V1) %>% mutate(ind = row_number()) %>% arrange(ind) -> tmp gg = ggplot(tmp, aes(y = ind, x = V1)) + geom_point() gg 图里应该可以清晰地看出连续序列了吧 所有可能的连续序列都在tmp的V1里,如果要找出所有序列的话就再用一次上面写的get_start_ed函数,这次不需要sort,自己改改应该不难 <sup>Created on 2019-01-04 by the reprex package (v0.2.1)</sup>