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()
를 사용하면 도 있습니다.convert
hablar
:
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
'IT' 카테고리의 다른 글
IntelliJ에서 셀레늄 서버를 시작하려고 할 때 jar 파일이 잘못되었거나 손상되었습니다. (0) | 2023.10.15 |
---|---|
주문 기준으로 카운트 선택(*) (0) | 2023.10.15 |
다중 FROM - 의미 (0) | 2023.10.15 |
케이스 무감각 플라스크-SQLlchemy 쿼리 (0) | 2023.10.15 |
Ajax post request in laravel 5 return error 500 (내부 서버 오류) (0) | 2023.10.15 |