首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何记录全年的数值?

如何记录全年的数值?
EN

Stack Overflow用户
提问于 2020-02-05 02:43:38
回答 2查看 35关注 0票数 1

我正在处理时间序列数据,如下所示:

代码语言:javascript
复制
     cname year govstruct
6091 China 1960         3
6092 China 1961         3
6093 China 1962         3
6094 China 1963         3
6095 China 1964         3
6096 China 1965         3
6097 China 1966         3
6098 China 1967         3
6099 China 1968         3
6100 China 1969         3
6101 China 1970         3
6102 China 1971         3
6103 China 1972         3
6104 China 1973         3
6105 China 1974         3
6106 China 1975         3
6107 China 1976         3
6108 China 1977         3
6109 China 1978         3
6110 China 1979         3
6111 China 1980         3
6112 China 1981         3
6113 China 1982         3
6114 China 1983         1
6115 China 1984         1
6116 China 1985         1
6117 China 1986         1
6118 China 1987         1
6119 China 1988         1
6120 China 1989         1
6121 China 1990         1
6122 China 1991         1
6123 China 1992         1
6124 China 1993         1
6125 China 1994         1
6126 China 1995         1
6127 China 1996         1
6128 China 1997         1
6129 China 1998         1
6130 China 1999         1
6131 China 2000         1
6132 China 2001         1
6133 China 2002         1
6134 China 2003         1
6135 China 2004         1
6136 China 2005         1
6137 China 2006         3
6138 China 2007         3
6139 China 2008         3
6140 China 2009         3
6141 China 2010         3
6142 China 2011         3
6143 China 2012         3

我想要构建一个数据集来记录govstruct所涵盖的日期范围。

我想要的是一个数据集,它记录了国家的名称、年份的范围和政府结构的价值。最后的数据集如下所示:

代码语言:javascript
复制
cname    years  govstruct
China 1960-1982    3
China 1983-2005    1
China 2006-2012    3

请注意,我将在世界各地转圈。因此,任何能够这样做的代码都将是非常感谢的。

非常感谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-05 02:46:22

这里有一个使用dplyr/data.table的选项,我们使用“cname”进行分组,使用“govstruct”的run-length-id进行分组,并在“年份”的range中使用pastesummarise进行分组。

代码语言:javascript
复制
library(dplyr)
library(stringr)
library(data.table)
df1 %>% 
    group_by(cname, grp = rleid(govstruct)) %>%
    summarise(govstructure = first(govstruct), 
         years = str_c(range(year), collapse="-"))  %>%
    ungroup %>%
    select(-grp)
# A tibble: 3 x 3
#  cname govstructure years    
#  <chr>        <int> <chr>    
#1 China            3 1960-1982
#2 China            1 1983-2005
#3 China            3 2006-2012

或者,我们也可以通过比较相邻元素来构造grp

代码语言:javascript
复制
df1 %>%
   group_by(cname, grp = cumsum(c(TRUE, diff(govstruct) != 0))) %>%
   summarise(govstructure = first(govstruct), 
         years = str_c(range(year), collapse="-")) 

或者使用与dplyr中相同的方法使用dplyr。即按'govstruct‘的rleid和'cname’pasterange’进行分组

代码语言:javascript
复制
library(data.table)
setDT(df1)[ , .(govstructure = first(govstruct),
      year = paste(range(year), collapse = "-")), 
      .(cname, grp = rleid(govstruct))][, grp := NULL][]
#  cname govstructure      year
#1: China            3 1960-1982
#2: China            1 1983-2005
#3: China            3 2006-2012

或使用base R的另一个选项

代码语言:javascript
复制
grp <- with(rle(df1$govstruct), rep(seq_along(values), lengths))
aggregate(year ~ cname + grp, data = df1, 
      FUN = function(x) paste(range(x), collapse="-"))

数据

代码语言:javascript
复制
df1 <- structure(list(cname = c("China", "China", "China", "China", 
"China", "China", "China", "China", "China", "China", "China", 
"China", "China", "China", "China", "China", "China", "China", 
"China", "China", "China", "China", "China", "China", "China", 
"China", "China", "China", "China", "China", "China", "China", 
"China", "China", "China", "China", "China", "China", "China", 
"China", "China", "China", "China", "China", "China", "China", 
"China", "China", "China", "China", "China", "China", "China"
), year = 1960:2012, govstruct = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L)), 
class = "data.frame", row.names = c(NA, 
-53L))
票数 2
EN

Stack Overflow用户

发布于 2020-02-05 02:47:37

我们可以使用data.table来计算每个cnamefirstlast year值以及govstruct的游程编码值。

代码语言:javascript
复制
library(data.table)

setDT(df)[ , .(year = paste(first(year), last(year), sep = "-"), 
           govstruct = first(govstruct)), .(cname, rleid(govstruct))]


#   cname rleid      year govstruct
#1: China     1 1960-1982         3
#2: China     2 1983-2005         1
#3: China     3 2006-2012         3
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60068312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档