여러 열을 한 번에 요인으로 강제 변환
다음과 같은 샘플 데이터 프레임이 있습니다.
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
입니다. 의 %<>%
연산자 magrittr
는 결과 값으로 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
사용하는 경우 다음 for
과 함께 루프를 사용하십시오.set
setDT(data)
for(j in cols){
set(data, i=NULL, j=j, value=factor(data[[j]]))
}
또는 'cols'를 .SDcols
지정 :=
하고 rhs를 '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, funs(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
그리고, 완전성과 관련하여 단지 문자열 열 변경에 대한 요청이 질문에 ,있다 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(.)))
mutate_if
( dplyr
) 를 사용할 수 있습니다 .
예를 들어, 강제 변환 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
테이블에서 값을 가져 와서 변환하는 데 사용하는 또 다른 목표가있는 경우 다음 방법을 시도 할 수 있습니다.
### 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]
이것은 특별히 문자 기반의 열을 선택한 다음 요인으로 변환합니다.
여기에 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]
참고 URL : https://stackoverflow.com/questions/33180058/coerce-multiple-columns-to-factors-at-once
'programing' 카테고리의 다른 글
ICE 후보자는 무엇이며 피어 연결은 어떻게 선택합니까? (0) | 2020.12.14 |
---|---|
MVC의 현재 컨텍스트에 '스크립트'라는 이름이 없습니다. (0) | 2020.12.14 |
CSS : 완전히 새로운 행을 수행하도록 float 강제 (0) | 2020.12.14 |
SQL Server 쿼리에서 주말을 제외하려면 어떻게합니까? (0) | 2020.12.14 |
데이터 프레임에서 문자 값을 NA로 바꾸기 (0) | 2020.12.14 |