2017-04-05 7 views
0

여러 열이있는 데이터 프레임이 있는데 그 중 일부는 chron을 사용하여 '시간'클래스로 변경해야 검색 할 수 있습니다. 기본 통계. 이 열은 현재 문자로 저장되며 다음과 같이 서식이 지정됩니다. hh : mm.chron을 사용하여 '문자'클래스에서 '시간'클래스로 데이터 프레임의 여러 열 변경

다음
> Data 
    DATE FLT TYPE REG AC DEP ARR STD STA ATD ATA 
1 15-01-02 953 J C-GCPT 73M YVQ YEV 12:00 12:55 13:00 13:59 
2 15-01-04 953 J C-GCPT 73M YVQ YEV 12:00 12:55 13:17 14:13 
3 15-01-05 953 J C-GCPT 73M YVQ YEV 12:00 12:55 13:20 14:14 

Time_list <-c("STD","STA","ATD","ATA") 

나는 단지 하나의 컬럼을 변경 한 일이다 (그리고 그것은 작동) : 여기

그것의 일부뿐만 아니라 변경해야 열 목록입니다

Data$ATA <- paste0(Data$ATA, ':00') 
    Data$ATA<-chron(times.=Data$ATA) 

    class(Data$ATA) 
    [1] "times" 

그러나 많은 컬럼이 있기 때문에 모든 컬럼을 동시에 수행하는 것을 선호합니다. 나는 여러 가지 기법을 시도했으며 일부는 '00 : 00 '을 붙여 넣는 첫 번째 부분에서는 작동하지만 두 번째 부분에서는 항상 chron을 사용하여 잘못 처리됩니다. 나는 for 루프

를 사용 apply

YEVdata[,(Time_list)] <- lapply(YEVdata[,(Time_list)], paste0,':00') 
Data[,(Time_list)] <- lapply(Data[,(Time_list)], chron, times. =Data[,(Time_list)]) 
**Error in FUN(X[[i]], ...) : 
    X[[i]] and Data[, (Time_list)] must have equal lengths** 
  • 를 사용 dmap

    Data[,Time_list]<- 
        Data%>% 
        select(one_of(Time_list)) %>% 
        dmap(paste0,':00') 
    
    Data[,Time_list]<- 
        Data %>% 
        select(one_of(Time_list)) %>% 
        dmap(chron,times.=Data[,Time_list]) 
    
    **Error in .f(.d[[i]], ...) : 
        .d[[i]] and Data[, Time_list] must have equal lengths** 
    
  • 를 사용하여 내가

    1. 을 이해하지 못하는 길이 문제를 갖고있는 것 같다

      for 루프를 사용해 보았습니다.하지만 초보자 일 뿐이므로 어디든지 갈 수 있습니다.

      1. 다른 스택 오버플로 질문에서 "간단한"솔루션을 사용하십시오.

      그냥 붙여 넣기조차했습니다.

      Efficiently transform multiple columns of a data frame

      일반 초보자의 언어로 모든 아이디어를 매우 극명하게 될 것이다! 두 작업을 모두 중첩 할 수 있다면 더 좋습니다!

  • +0

    기본적인 이전'lapply' 그것을해야 - '데이터 [Time_list] <- lapply (데이터 [Time_list, 함수 (x)는 시간 (paste0 (데이터 $ ATA, "00")))' – thelatemail

    +0

    기본적으로 Josh의 링크 된 질문의 대답과 동일합니다. - http://stackoverflow.com/a/17453493/496803 -'lapply (...' – thelatemail

    +0

    @thelatemail을 시작한 행, 나는 그것을 시도했지만 여전히 오류가납니다. 데이터에 오류가 있습니다. $ ATA : objet de type 'closure'not indiable. – lcabral

    답변

    0

    dplyr::mutate_at이 상황에서 작동합니다. mutate 할 변수를 정의한 다음 사용할 함수를 정의하십시오.

    . 표기법 및 중첩 기능을 사용하여 붙여 넣기 및 변환을 한 번에 funs 내에 수행 할 수 있습니다.

    library(dplyr) 
    Data = mutate_at(Data, Time_list, funs(chron(times. = paste0(., ":00")))) 
    
    +0

    고마워요. 대단한 일이었습니다. 후속 작업으로 괜찮 았으면 좋겠어요. 시간 열 중 일부는 실제로 "h : mm"형식으로 작성되었습니다. OR "hh : mm"(그리고 칼럼에도 NAs가있다.) 그래서 나는 이것을했다 : Data = mutate_at (data, Delays, funs (chron (times. = paste0 ("0",., ": 00")))) 오류 메시지 (unpaste (시간, sep = fmt $ sep, fnames = fmt $ periods, nfields = 3)가 있음에도 불구하고 작동하는 것처럼 보였습니다. 잘못된 필드 수 in entry (ies) 1, 2)하지만 if/else 문을 추가하는 방법에 관해서는 머리 글을 얻을 수 없습니다. IF 길이가 4보다 작 으면 앞면에 0을 붙여 넣고, 그렇지 않으면 "00 :"만 붙이십시오. 어떤 아이디어? – lcabral

    +0

    @lcabral'chron'이 몇 시간 동안 0을 쓰지 않고 나를 위해 작동하는 것처럼 보입니다. 그것들을 추가 할 필요가 있다면,'nchar'은'ifelse' 문에 도움이 될 것입니다. – aosmith