2017-01-24 2 views
1

날짜 (dd/mm/yyyy)가 포함 된 데이터가 있고 연도별로 데이터를 요약하려고합니다. 더 쉬운 방법이 있다고 확신하지만, 제가 취한 경로는 "cut"함수를 사용하여 새로운 범주 형 변수를 만들려고 시도하는 것입니다. 예를 들어날짜 데이터에서 범주 형 변수 만들기 R

는 :

invalid specification of 'breaks' 

어떻게 R 다양한 "날짜"간격으로 잘라 말할까요 :

# create sample dataframe 
dates<-c("01/01/2013", "01/02/2013", "01/01/2014", "01/02/2014", "01/01/2015", "01/02/2015") 
cases<-c(3,5,2,6,8,4) 
df<-as.data.frame(cbind(dates, cases)) 
df$dates <- as.Date(df$dates,"%d/%m/%Y") 

# categorise by year 
df$year <- cut(df$dates, c(2013-01-01, 2013-12-31, 2014-12-31, 2015-12-31)) 

이 오류를 준다? 이것에 대한 나의 접근 방식은 모두 잘못 되었습니까? 아직 R에 익숙하지 않습니다 (기본적인 질문은 유감입니다).

그레그

+0

'breaks'인수가 잘못되었습니다. 입력은 문자열 (작동 할 수도 있음) 또는 문자열을 사용하여 쉽게 구 성할 수있는 날짜 객체 여야합니다 (Leo P.의 대답 참조). –

+0

cbind는'cases'가 숫자가 아닌 문자가되도록합니다. –

답변

0

출력은 어떻게 생겼을 까?

breaks <- as.Date(c("2013-01-01", "2013-12-31", "2014-12-31", "2015-12-31")) 

# categorise by year 
df$year <- cut(df$dates, breaks) 

     dates cases  year 
1 2013-01-01  3 2013-01-01 
2 2013-02-01  5 2013-01-01 
3 2014-01-01  2 2013-12-31 
4 2014-02-01  6 2013-12-31 
5 2015-01-01  8 2014-12-31 
6 2015-02-01  4 2014-12-31 

를 내가 추측하고있어 당신이 원하는 당신의 year는하지만, 다르게 할 변수 : 당신이 as.Date와 휴식을 정의 할 때

코드는 작동? cut를 사용할 때 labels을 정의 할 수 있습니다 : 당신은 그냥 올해를 찾고 있다면

# categorise by year 
df$year <- cut(df$dates, breaks, labels = c(2013, 2014, 2015)) 

     dates cases year 
1 2013-01-01  3 2013 
2 2013-02-01  5 2013 
3 2014-01-01  2 2014 
4 2014-02-01  6 2014 
5 2015-01-01  8 2015 
6 2015-02-01  4 2015 
1

, 아마도 이것이 도움이 :

df$year <- format(df$dates, format="%Y")

 dates cases year 
1 2013-01-01  3 2013 
2 2013-02-01  5 2013 
3 2014-01-01  2 2014 
4 2014-02-01  6 2014 
5 2015-01-01  8 2015 
6 2015-02-01  4 2015 
1

간단한 해결책은 dplyr 패키지를 사용하는 것입니다.

mutate 문에서
library(dplyr) 

df_grouped <- df %>% 
    mutate(
    dates = as_date(dates), 
    cases = as.numeric(cases)) %>% 
    group_by(year = year(dates)) %>% 
    summarise(tot_cases = sum(cases)) 

우리가 group_by에 더 적합한 형식으로 변수를 변환 우리가 변수가 그룹화를 할 것입니다있는 선택하고 summarise에서 우리는 우리가 원하는 새로운 변수를 만들 : 다음은 간단한 예입니다 .

df_grouped은 다음과 같습니다

# A tibble: 3 × 2 
    year tot_cases 
    <dbl>  <dbl> 
1 2013   6 
2 2014   6 
3 2015   9 
+0

솔루션의 결과가 올바르지 않습니다. 'df'의'cases' 컬럼은 하나의 요소입니다. 그것에'as.numeric'을 호출하면 정확한 숫자가 생성되지 않고, 팩터 레벨의 기본 카테고리 ID가 제공됩니다. 올바른 결과를 얻으려면'as.numeric (as.character()) '를 호출해야합니다. 올바른 해결책은 내 대답을 참조하십시오. 또한 게시 한 출력에 2015가 누락되었습니다. –

1

내가 cut을 기반으로 솔루션은 조금 잔인한 생각합니다. 당신은 날짜에서 연도 추출 할 lubridate 패키지에서 year 기능을 사용할 수 있습니다 : 그것은 시간 데이터 처리에 관해서

library(dplyr) 
library(lubridate) 
df %>% mutate(year = year(dates)) 
#  dates cases year 
# 1 2013-01-01  3 2013 
# 2 2013-02-01  5 2013 
# 3 2014-01-01  2 2014 
# 4 2014-02-01  6 2014 
# 5 2015-01-01  8 2015 
# 6 2015-02-01  4 2015 

lubridate는 멋진 패키지입니다.

year 열이 만들어진 후 모든 종류의 요약을 적용 할 수 있습니다. group_by이 모든 작업은 그 후 매년이 경우에, 거기에 언급 된 고유의 카테고리에 따라 수행되는 것을 보장

# Note that as.numeric(as.character()) is needed as `cbind` forces `cases` to be a factor 
df %>% mutate(year = year(dates), cases = as.numeric(as.character(cases))) %>% 
    group_by(year) %>% summarise(tot_cases = sum(cases)) 
# # A tibble: 3 × 2 
# year tot_cases 
# <dbl>  <dbl> 
# 1 2013   8 
# 2 2014   8 
# 3 2015  12 

하는 것으로 : 나는 여기에 dplyr 스타일을 사용합니다.

관련 문제