我有一系列价值观,每年从1936年到2015年一个值。现在我正在寻找一个优雅的解决方案(在R中)来识别两个连续的(!)时期(每个时期具有n年的最小(或最大),比如说15年),这两个时期具有两个彼此最不同的方式。因此,我正在寻找特定年份将该系列分成两组。
当然,我可以通过一个循环来处理这个问题来比较每个组的组合,但我想知道是否有更好的方法。通常我正在使用ggplot和dplyr系统学。所以,任何暗示都是有益的。
require(dplyr)
structure(list(year = c(1936, 1937, 1938, 1939, 1940, 1941, 1942,
1943, 1944, 1945, 1946, 1947, 1948, 1949, 1950, 1951, 1952, 1953,
1954, 1955, 1956, 1957, 1958, 1959, 1960, 1961, 1962, 1963, 1964,
1965, 1966, 1967, 1968, 1969, 1970, 1971, 1972, 1973, 1974, 1975,
1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986,
1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
2009, 2010, 2011, 2012, 2013, 2014, 2015), q = c(1.31495, 0.81315,
0.60275, 0.9025, 1.11875, 1.1897, 0.82025, 0.5936, 0.90045, 1.37755,
1.18465, 2.5685, 2.52925, 0.59695, 0.8666, 0.97685, 1.63635,
1.30825, 1.4089, 1.99535, 1.4652, 0.7518, 1.2352, 1.5946, 1.19385,
1.0436, 0.80355, 0.6153, 0.68, 1.7616, 2.76765, 2.37105, 1.4026,
0.87665, 0.76225, 0.73925, 0.7226, 0.9125, 2.02875, 1.81795,
0.69295, 1.33245, 1.7908, 2.01205, 1.365, 1.6906, 2.40445, 1.52365,
1.0436, 1.00605, 1.63635, 1.9244, 1.3984, 1.27735, 1.52365, 2.01205,
1.26065, 1.69895, 2.24585, 2.17905, 1.68225, 1.49445, 1.4151,
2.1164, 1.88265, 1.75745, 2.7175, 1.7157, 0.94675, 0.87455, 0.70465,
0.8624, 1.01855, 1.3984, 1.9912, 1.54455, 2.5297, 2.513, 1.43185,
0.89415)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-80L), .Names = c("year", "q"))
预期结果如下:
year q class mean
<dbl> <dbl> <int> <dbl>
1 1936 1.31495 1 1.2563
2 1937 0.81315 1 1.2563
3 1938 0.60275 1 1.2563
4 1939 0.90250 1 1.2563
5 1940 1.11875 1 1.2563
6 1941 1.18970 1 1.2563
...
1 2010 1.99120 2 1.5877
2 2011 1.54455 2 1.5877
3 2012 2.52970 2 1.5877
4 2013 2.51300 2 1.5877
5 2014 1.43185 2 1.5877
6 2015 0.89415 2 1.5877
答案 0 :(得分:1)
我们可以这样做:
n <- 15
(正如你的建议)
meanInfEq
是在所有年份中计算的q
的平均值,其低于或等于特定年份,而meanSup
是在剩余年份内计算的。diff
。 df <- df %>%
mutate(meanInfEq = q %>% cummean,
meanSup = q %>% rev %>% cummean %>% rev %>% lead,
diff = abs(meanInfEq - meanSup))
是这两种方法差异的绝对值:
rev %>% cummean %>% rev
请注意,df
只是从数据框底部开始计算累积均值的技巧。
我们限制n
关注长度大于或等于df2 <- df %>% filter(year %in% (1936+n-1):(2015-n+1))
的时段:
yearCut
现在我们可以找到k <- which.max(df2$diff)
yearCut <- df2$year[k]
mean1 <- df2$meanInfEq[k]
mean2 <- df2$meanSup[k]
output <- df %>%
mutate(class = ifelse(year <= yearCut, 1, 2),
mean = ifelse(year <= yearCut, mean1, mean2)) %>%
select(year, q, class, mean)
,定义为最大化绝对差异的年份(或更确切地说, a 年份):
n
当yearCut
等于15时, year q class mean
<dbl> <dbl> <dbl> <dbl>
1936 1.31495 1 1.175462
1937 0.81315 1 1.175462
1938 0.60275 1 1.175462
1939 0.90250 1 1.175462
1940 1.11875 1 1.175462
1941 1.18970 1 1.175462
...
2010 1.99120 2 1.562204
2011 1.54455 2 1.562204
2012 2.52970 2 1.562204
2013 2.51300 2 1.562204
2014 1.43185 2 1.562204
2015 0.89415 2 1.562204
1964 ,输出如下所示:
var email = document.getElementById("eMail").value.trim();
var repeat = document.getElementById("eMail_repeat").value.trim();