找出一个系列的两种最不同的方法

时间:2016-10-25 12:26:04

标签: r dplyr

我有一系列价值观,每年从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

1 个答案:

答案 0 :(得分:1)

我们可以这样做:

n <- 15(正如你的建议)

meanInfEq是在所有年份中计算的q的平均值,其低于或等于特定年份,而meanSup是在剩余年份内计算的。diffdf <- 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();