2017-10-17 15 views
0

큰 데이터 프레임이 있습니다. 다음과 같이 더 작은 서브 세트이다특정 열 이름을 기반으로 문자 벡터에서 쉼표를 제거하십시오. R

structure(list(Date = c("2017-08-12", "2017-08-12", "2017-08-12" 
), `Time (sec)` = c("19:01:04", "07:30:18", "04:29:38"), `4+DURATION` = c("26", 
    "58,000", "27"), `4+'000 (AVG)` = c("0.0000", "0.0000", "0.0000"), 
    `15+DURATION` = c("26", "57,000", "27"), `15+'000 (AVG)` = c("0.0000", 
    "0.0000", "0.0000")), .Names = c("Date", "Time (sec)", "4+DURATION", 
    "4+'000 (AVG)", "15+DURATION", "15+'000 (AVG)"), row.names = 3:5, class = "data.frame") 

실제 데이터 프레임은 다음과 같다 : 이후 열 3 열 나머지 이것으로

 Date Time (sec) 4+DURATION 4+'000 (AVG) 15+DURATION 15+'000 (AVG) 
3 2017-08-12 19:01:04   26  0.0000   26  0.0000 
4 2017-08-12 07:30:18  58,000  0.0000  57,000  0.0000 
5 2017-08-12 04:29:38   27  0.0000   27  0.0000 

가 문자 벡터로서 저장 하였다. 문자를 숫자로 변환하려고합니다. 다음은 내가 사용한 코드입니다.

cols.num <- names(dat[,-c(1:2)]) 
dat[cols.num] <- sapply(dat[cols.num],as.numeric) 

dat은 내 데이터 프레임입니다. 이것은 문자 값에 여분의 쉼표가있는 두 지속 기간 열 모두에서 NA 값을 강제합니다.

제가

df[,unique(grep("DUR", names(df), value=T))] <- gsub(",","",df[,unique(grep("DUR", names(df), value=T))]) 

하여 제거하려고하지만이

Date Time (sec)   4+DURATION 4+'000 (AVG)   15+DURATION 15+'000 (AVG) 
3 2017-08-12 19:01:04 c("26" "58000" "27")  0.0000 c("26" "57000" "27")  0.0000 
4 2017-08-12 07:30:18 c("26" "57000" "27")  0.0000 c("26" "58000" "27")  0.0000 
5 2017-08-12 04:29:38 c("26" "58000" "27")  0.0000 c("26" "57000" "27")  0.0000 

하지만 원하는 출력이 같은 DF를 생성한다

Date Time (sec) 4+DURATION 4+'000 (AVG) 15+DURATION 15+'000 (AVG) 
3 2017-08-12 19:01:04   26  0.0000   26  0.0000 
4 2017-08-12 07:30:18  58000  0.0000  57000  0.0000 
5 2017-08-12 04:29:38   27  0.0000   27  0.0000 

이 데이터 프레임에서 문제 , 어떤 열에 기간 값이 있고 기간 값이있는 열 이름이 4+에서 계속 변경되는지 알 수 없습니다. DURATION ~ 45 + DURATION 등. 벡터에 숫자를 저장하기 전에 이름에 DURATION이있는 모든 벡터에서 쉼표를 제거하고 싶습니다.

+2

'적용'해야합니다. 'gsub'는 벡터화되지 않습니다. (df ​​[, unique (...))], function (i) gsub (...)) df [, 고유 (grep ("DUR", 이름 (df), 값 = T) ' – Sotos

+0

@Sotos 고마워 .... 알았어. 나는 적용을 시도하고 있었고 결코 끝나지 않는 문제 해결에 들어갔다. 대답으로 이것을 받아 들일 수있다. – Apricot

답변

2

당신은 (sub도 여기에 잘 할 것, FYI) gsub 이후 관심의 열을 *apply를 필요 즉,

df[,unique(grep("DUR", names(df), value=T))] <- 
        lapply(df[,unique(grep("DUR", names(df), value=T))], function(i) 
                  as.numeric(sub(',', '', i))) 
하지 벡터화입니다

이것은 다음을 제공한다 :

 Date Time (sec) 4+DURATION 4+'000 (AVG) 15+DURATION 15+'000 (AVG) 
3 2017-08-12 19:01:04   26  0.0000   26  0.0000 
4 2017-08-12 07:30:18  58000  0.0000  57000  0.0000 
5 2017-08-12 04:29:38   27  0.0000   27  0.0000 
#str(df) 
#'data.frame': 3 obs. of 6 variables: 
# $ Date   : chr "2017-08-12" "2017-08-12" "2017-08-12" 
# $ Time (sec) : chr "19:01:04" "07:30:18" "04:29:38" 
# $ 4+DURATION : num 26 58000 27 
# $ 4+'000 (AVG) : chr "0.0000" "0.0000" "0.0000" 
# $ 15+DURATION : num 26 57000 27 
# $ 15+'000 (AVG): chr "0.0000" "0.0000" "0.0000" 
1

dplyr 솔루션 :

d <- structure(list(Date = c("2017-08-12", "2017-08-12", "2017-08-12" 
), `Time (sec)` = c("19:01:04", "07:30:18", "04:29:38"), `4+DURATION` = c("26", 
    "58,000", "27"), `4+'000 (AVG)` = c("0.0000", "0.0000", "0.0000"), 
    `15+DURATION` = c("26", "57,000", "27"), `15+'000 (AVG)` = c("0.0000", 
    "0.0000", "0.0000")), .Names = c("Date", "Time (sec)", "4+DURATION", 
    "4+'000 (AVG)", "15+DURATION", "15+'000 (AVG)"), row.names = 3:5, class = "data.frame") 
d2 <- d %>% mutate_at(vars(contains('DURATION')), funs(as.numeric(gsub(',', '', .)))) 
str(d2) 
+1

당신은 또한 최근의'dplyr' pkg 버전을 가지고'mutate_at (vars (contains DURATION ')), ~ as.numeric (gsub (', ',',.)))'을 할 수 있습니다 – hrbrmstr

+0

고마워요 암시! –