2016-07-15 27 views
0

假设我有一个包含年份和月份这个名单:单独一年的日期格式

l <- c(200101, 200102 ,200103, 200104) 

我想将它们分开,这样我可以有再进2单独的列表。 这里是我做的,没有运气:

as.Date(l,"%Y%m",format = "%Y") 

回答

3

这会工作:

year_list<-as.numeric(substr(as.numeric(l),1,4)) 
month_list<-as.numeric(substr(as.numeric(l),5,6)) 

例1:

> l <- c(200101, 200102 ,200103, 200104) 
> l 
[1] 200101 200102 200103 200104 

> year_list<-as.numeric(substr(as.numeric(l),1,4)) 
> year_list 
[1] 2001 2001 2001 2001 

> month_list<-as.numeric(substr(as.numeric(l),5,6)) 
> month_list 
[1] 1 2 3 4 

例2:

> l <- c(200701, 200802 ,200903, 201604) 
> year_list<-as.numeric(substr(as.numeric(l),1,4)) 
> year_list 
[1] 2007 2008 2009 2016 
> month_list<-as.numeric(substr(as.numeric(l),5,6)) 
> month_list 
[1] 1 2 3 4 
3

tidyr::separate能拿一个整数位置分裂,但它只需要data.frames。这还不是全部坏在这里,不过,因为它是一个不错的输出格式,反正:

library(tidyr) 

data.frame(l = c(200101, 200102 ,200103, 200104)) %>% 
    separate(l, into = c('year', 'month'), sep = 4) 
## year month 
## 1 2001 01 
## 2 2001 02 
## 3 2001 03 
## 4 2001 04 
4

你可以这样做:

rbind(floor(l/100), l%%100) 

#  [,1] [,2] [,3] [,4] 
#[1,] 2001 2001 2001 2001 
#[2,] 1 2 3 4 
1

我们可以使用strsplitbase R

do.call(rbind, lapply(strsplit(as.character(l), 
        '(?<=.{4})', perl=TRUE), as.numeric)) 

或者在另一个base R选项中通过在字符间创建一个分隔符并使用read.csv

read.csv(text=sub("(.{4})(.{2})", "\\1,\\2", l), header=FALSE, 
      col.names= c("Year", "Month")) 
# Year Month 
#1 2001  1 
#2 2001  2 
#3 2001  3 
#4 2001  4