여러 열을 요인에 한 번에 강제 적용
아래와 같은 샘플 데이터 프레임이 있습니다.
data <- data.frame(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10])))
여러 개의 열을 선택하여 인자로 함께 변환하는 방법을 알고 싶습니다.저는 보통 이런 식으로 해요.data$A = as.factor(data$A)
. 그러나 데이터 프레임이 매우 크고 많은 열을 포함하는 경우, 이 방법은 매우 많은 시간이 소요될 것입니다.더 나은 방법을 아는 사람 있습니까?
요인에 강제 적용할 일부 열을 선택합니다.
cols <- c("A", "C", "D", "H")
사용하다lapply()
선택한 열을 강제로 바꾸고 교체하는 방법:
data[cols] <- lapply(data[cols], factor) ## as.factor() could also be used
결과를 확인합니다.
sapply(data, class)
# A B C D E F G
# "factor" "integer" "factor" "factor" "integer" "integer" "integer"
# H I J
# "factor" "integer" "integer"
다음은 다음을 사용하는 옵션입니다.dplyr
.그%<>%
오퍼레이터 frommagrittr
결과 값으로 lhs 개체를 업데이트합니다.
library(magrittr)
library(dplyr)
cols <- c("A", "C", "D", "H")
data %<>%
mutate_each_(funs(factor(.)),cols)
str(data)
#'data.frame': 4 obs. of 10 variables:
# $ A: Factor w/ 4 levels "23","24","26",..: 1 2 3 4
# $ B: int 15 13 39 16
# $ C: Factor w/ 4 levels "3","5","18","37": 2 1 3 4
# $ D: Factor w/ 4 levels "2","6","28","38": 3 1 4 2
# $ E: int 14 4 22 20
# $ F: int 7 19 36 27
# $ G: int 35 40 21 10
# $ H: Factor w/ 4 levels "11","29","32",..: 1 4 3 2
# $ I: int 17 1 9 25
# $ J: int 12 30 8 33
또는 사용하는 경우.data.table
, a를 사용하든지for
로 고리 모양의set
setDT(data)
for(j in cols){
set(data, i=NULL, j=j, value=factor(data[[j]]))
}
또는 'cols'를 지정할 수 있습니다..SDcols
할당()합니다.:=
) rhs to 'cols'
setDT(data)[, (cols):= lapply(.SD, factor), .SDcols=cols]
더 최근에tidyverse
방법은.mutate_at
함수:
library(tidyverse)
library(magrittr)
set.seed(88)
data <- data.frame(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10])))
cols <- c("A", "C", "D", "H")
data %<>% mutate_at(cols, factor)
str(data)
$ A: Factor w/ 4 levels "5","17","18",..: 2 1 4 3
$ B: int 36 35 2 26
$ C: Factor w/ 4 levels "22","31","32",..: 1 2 4 3
$ D: Factor w/ 4 levels "1","9","16","39": 3 4 1 2
$ E: int 3 14 30 38
$ F: int 27 15 28 37
$ G: int 19 11 6 21
$ H: Factor w/ 4 levels "7","12","20",..: 1 3 4 2
$ I: int 23 24 13 8
$ J: int 10 25 4 33
2021년 현재(2023년 초 현재), 현재tidyverse/dplyr
접근 방법은 사용하는 것입니다.across
, 그리고.<tidy-select>
진술.
library(dplyr)
data %>% mutate(across(*<tidy-select>*, *function*))
across(<tidy-select>)
변환할 열을 매우 일관적이고 쉽게 선택할 수 있습니다.몇 가지 예:
data %>% mutate(across(c(A, B, C, E), as.factor)) # select columns A to C, and E (by name)
data %>% mutate(across(where(is.character), as.factor)) # select character columns
data %>% mutate(across(1:5, as.factor)) # select first 5 columns (by index)
사용가능mutate_if
(dplyr
):
예를 들어, corce(강요integer
인에factor
:
mydata=structure(list(a = 1:10, b = 1:10, c = c("a", "a", "b", "b",
"c", "c", "c", "c", "c", "c")), row.names = c(NA, -10L), class = c("tbl_df",
"tbl", "data.frame"))
# A tibble: 10 x 3
a b c
<int> <int> <chr>
1 1 1 a
2 2 2 a
3 3 3 b
4 4 4 b
5 5 5 c
6 6 6 c
7 7 7 c
8 8 8 c
9 9 9 c
10 10 10 c
다음 기능을 사용합니다.
library(dplyr)
mydata%>%
mutate_if(is.integer,as.factor)
# A tibble: 10 x 3
a b c
<fct> <fct> <chr>
1 1 1 a
2 2 2 a
3 3 3 b
4 4 4 b
5 5 5 c
6 6 6 c
7 7 7 c
8 8 8 c
9 9 9 c
10 10 10 c
그리고 완성도를 위해 문자열 열만 바꾸는 것에 대해 묻는 이 질문에 대해서는 다음과 관련 사항이 있습니다.mutate_if
:
data <- cbind(stringVar = sample(c("foo","bar"),10,replace=TRUE),
data.frame(matrix(sample(1:40), 10, 10, dimnames = list(1:10, LETTERS[1:10]))),stringsAsFactors=FALSE)
factoredData = data %>% mutate_if(is.character,funs(factor(.)))
여기에.data.table
예.사용했습니다.grep
이 예제에서는 종종 이름에 부분 일치를 사용하여 많은 열을 선택하기 때문입니다.
library(data.table)
data <- data.table(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10])))
factorCols <- grep(pattern = "A|C|D|H", x = names(data), value = TRUE)
data[, (factorCols) := lapply(.SD, as.factor), .SDcols = factorCols]
간편하고 업데이트된 솔루션
data <- data %>%
mutate_at(cols, list(~factor(.)))
표에서 값을 가져온 다음 이 값을 사용하여 변환하는 다른 목적이 있다면 다음과 같은 방법을 시도할 수 있습니다.
### pre processing
ind <- bigm.train[,lapply(.SD,is.character)]
ind <- names(ind[,.SD[T]])
### Convert multiple columns to factor
bigm.train[,(ind):=lapply(.SD,factor),.SDcols=ind]
이렇게 하면 특정 문자 기반의 열을 선택한 다음 요인으로 변환합니다.
다음은 다음과 같은 방법을 사용한 또 다른 깔끔한 역 접근법입니다.modify_at()
로부터의 기능purrr
꾸러미의
library(purrr)
# Data frame with only integer columns
data <- data.frame(matrix(sample(1:40), 4, 10, dimnames = list(1:4, LETTERS[1:10])))
# Modify specified columns to a factor class
data_with_factors <- data %>%
purrr::modify_at(c("A", "C", "E"), factor)
# Check the results:
str(data_with_factors)
# 'data.frame': 4 obs. of 10 variables:
# $ A: Factor w/ 4 levels "8","12","33",..: 1 3 4 2
# $ B: int 25 32 2 19
# $ C: Factor w/ 4 levels "5","15","35",..: 1 3 4 2
# $ D: int 11 7 27 6
# $ E: Factor w/ 4 levels "1","4","16","20": 2 3 1 4
# $ F: int 21 23 39 18
# $ G: int 31 14 38 26
# $ H: int 17 24 34 10
# $ I: int 13 28 30 29
# $ J: int 3 22 37 9
data.frame에서 SAPPLY를 사용하여 변수를 한 번에 요인으로 변환하는 것은 행렬/배열을 생성하기 때문에 작동하지 않는 것으로 보입니다.저의 접근 방식은 다음과 같이 LAPPLY를 대신 사용하는 것입니다.
## let us create a data.frame here
class <- c("7", "6", "5", "3")
cash <- c(100, 200, 300, 150)
height <- c(170, 180, 150, 165)
people <- data.frame(class, cash, height)
class(people) ## This is a dataframe
## We now apply lapply to the data.frame as follows.
bb <- lapply(people, as.factor) %>% data.frame()
## The lapply part returns a list which we coerce back to a data.frame
class(bb) ## A data.frame
##Now let us check the classes of the variables
class(bb$class)
class(bb$height)
class(bb$cash) ## as expected, are all factors.
데이터에 일치하는 패턴이 있는 여러 열을 변환하려는 경우 다음과 같은 해결 방법이 있습니다.
library(dplyr)
data <- data.frame(matrix(sample(0:1, 40, replace = TRUE), 4, 10, dimnames = list(1:4, LETTERS[1:10])))
colnames(data) <- c(LETTERS[1:5], paste0(rep("binary_", 5), LETTERS[6:10]))
data <- data %>%
mutate_if(grepl("binary", colnames(.)), as.factor)
언급URL : https://stackoverflow.com/questions/33180058/coerce-multiple-columns-to-factors-at-once
'programing' 카테고리의 다른 글
배열을 양 끝에 대해 자르는 관용적인 방법은 무엇입니까? (0) | 2023.10.05 |
---|---|
cygwin - UNC 공유에 파일 복사 (0) | 2023.10.05 |
포인터 표현: **ptr++*++*ptr 및 ++**ptruse (0) | 2023.10.05 |
자바스크립트에 대한 코딩 표준이 있습니까? (0) | 2023.10.05 |
MySQL 데이터베이스에서 두 열을 업데이트하는 방법은? (0) | 2023.10.05 |