IT

dplyr 많은 데이터 유형 변경

itgroup 2023. 10. 15. 17:13
반응형

dplyr 많은 데이터 유형 변경

data.frame:

dat <- data.frame(fac1 = c(1, 2),
                  fac2 = c(4, 5),
                  fac3 = c(7, 8),
                  dbl1 = c('1', '2'),
                  dbl2 = c('4', '5'),
                  dbl3 = c('6', '7')
                  )

데이터 유형을 변경하려면 다음과 같은 것을 사용할 수 있습니다.

l1 <- c("fac1", "fac2", "fac3")
l2 <- c("dbl1", "dbl2", "dbl3")
dat[, l1] <- lapply(dat[, l1], factor)
dat[, l2] <- lapply(dat[, l2], as.numeric)

와 함께dplyr

dat <- dat %>% mutate(
    fac1 = factor(fac1), fac2 = factor(fac2), fac3 = factor(fac3),
    dbl1 = as.numeric(dbl1), dbl2 = as.numeric(dbl2), dbl3 = as.numeric(dbl3)
)

dplyr에서 더 우아한 (shorter) 방법이 있습니까?

의 그리스도

편집(2021-03 기준)

에릭의 대답에서도 지적했듯이,mutate_[at|if|all]의 조합으로 대체되었습니다.mutate()그리고.across(). 참고로, 원래 답변의 예에 해당 펜던트를 추가하겠습니다(아래 참조).

# convert all factor to character
dat %>% mutate(across(where(is.factor), as.character))

# apply function (change encoding) to all character columns 
dat %>% mutate(across(where(is.character), 
               function(x){iconv(x, to = "ASCII//TRANSLIT")}))

# subsitute all NA in numeric columns
dat %>% mutate(across(where(is.numeric), function(x) tidyr::replace_na(x, 0)))

원답

닉의 답변은 지금쯤은 평가절하되고 라파엘의 코멘트는 정말 유용하기 때문에 이것을 답변으로 추가하고 싶습니다.모두 변경하려면 factor에 줄을 대다.character사용하다mutate_if:

dat %>% mutate_if(is.factor, as.character)

또한 다른 기능도 허용됩니다.예를 들어 사용했습니다.iconv모두의 부호화를 바꾸다character열:

dat %>% mutate_if(is.character, function(x){iconv(x, to = "ASCII//TRANSLIT")})

아니면 모두를 대신해서NA숫자 열에서 0으로 표시:

dat %>% mutate_if(is.numeric, function(x){ifelse(is.na(x), 0, x)})

의 표준 평가 버전을 사용할 수 있습니다.mutate_each(즉mutate_each_열 클래스를 변경하려면:

dat %>% mutate_each_(funs(factor), l1) %>% mutate_each_(funs(as.numeric), l2)

편집 - 이 답변의 구문이 더 이상 사용되지 않습니다. 로키의 업데이트된 답변이 더 적합합니다.

오리지널-

맨 아래부터.?mutate_each(적어도 dplyr 0.5에서) @docendo discimus의 답변처럼 해당 기능은 더 이상 사용되지 않고 보다 유연한 대안으로 대체될 것으로 보입니다.mutate_if,mutate_all,그리고.mutate_at. @hadley가 그의 코멘트에서 언급한 것과 가장 유사한 것은 아마도 사용하는 것일 것입니다.mutate_at. 다음과 비교하여 인수의 순서가 반대라는 점에 유의하십시오.mutate_each,그리고.vars()사용하다select()의미론처럼 내가 해석하는 것은?select_helpers기능들.

dat %>% mutate_at(vars(starts_with("fac")),funs(factor)) %>%   
  mutate_at(vars(starts_with("dbl")),funs(as.numeric))

그렇지만mutate_at대신에 열 번호를 취할 수 있습니다.vars()논쟁, 그리고 이 페이지를 읽고 대안들을 살펴본 후에, 나는 결국mutate_at하지만 같이grep여러 종류의 열 이름을 한 번에 캡처합니다(항상 이렇게 명백한 열 이름이 있는 경우를 제외하고!).

dat %>% mutate_at(grep("^(fac|fctr|fckr)",colnames(.)),funs(factor)) %>%
  mutate_at(grep("^(dbl|num|qty)",colnames(.)),funs(as.numeric))

그 사실을 알게 된 것에 대해 매우 흥분했습니다.mutate_at+grep, 이제 하나의 선이 많은 열에 작용할 수 있기 때문입니다.

편집 - 이제 그렇군요matches()regex를 처리하는 select_helper 중에서 나는 지금 이것을 좋아합니다.

dat %>% mutate_at(vars(matches("fac|fctr|fckr")),funs(factor)) %>%
  mutate_at(vars(matches("dbl|num|qty")),funs(as.numeric))

또 다른 일반적으로 관련된 설명 - 일치하는 이름과 일관된 형식을 가진 모든 날짜 열을 가지고 있다면 이는 강력합니다.저 같은 경우에는 숫자로 읽히던 YYYMMDD 열을 모두 날짜로 바꿉니다.

  mutate_at(vars(matches("_DT$")),funs(as.Date(as.character(.),format="%Y%m%d")))

드플라이어across함수가 대체되었습니다._if,_at,그리고._all.봐vignette("colwise").

dat %>% 
mutate(across(all_of(l1), as.factor),
       across(all_of(l2), as.numeric))

와는 한통속입니다.mutate_at:

dat %>% mutate_at("l1", factor) %>% mutate_at("l2", as.numeric)

열 유형 변환을 달성하는 보다 일반적인 방법은 다음과 같습니다.

모든 요인 열을 문자 열로 변환하려면 하나의 파이프를 사용하여 이 작업을 수행할 수 있습니다.

df %>%  mutate_each_( funs(as.character(.)), names( .[,sapply(., is.factor)] ))

당신이 에 ,dplyr체 df의 col다를 사용하여 할 수 있습니다.readr그리고.col_guess()와 함께

library(tidyverse)
df %>% type_convert()

를 사용하면 도 있습니다.converthablar:

library(hablar)

dat %>% 
  convert(fct(fac1, fac2, fac3),
          num(dbl1, dbl2, dbl3))

합니다와 합니다.tidyselect:

dat %>% 
  convert(fct(contains("fac")),
          num(contains("dbl")))

이거 먹어봐요.

df[,1:11] <- sapply(df[,1:11], as.character)

언급URL : https://stackoverflow.com/questions/27668266/dplyr-change-many-data-types

반응형