data.frame 열 형식을 문자에서 요소로 변환


153

data.frame 객체 ( mydf) 의 일부 열의 형식 (클래스 )을 charactor 에서 factor 로 변경하고 싶습니다 .

read.table()함수로 텍스트 파일을 읽을 때이 작업을 수행하고 싶지 않습니다 .

도움을 주시면 감사하겠습니다.


12
mydf $ myfavoritecolumn <-as.factor (mydf $ myfavoritecolumn)
팀 리페

감사! 하지만 다른 문제가 있습니다. col_names [] 문자 배열에 각 열의 이름이 있습니다. 위의 명령 (mydf $ col_names [i])을 어떻게 사용할 수 있습니까?
Rasoul

data.frame이 stringsAsFactors와 같이 모든 문자 변수에 대해 자동 으로이 작업을 수행 할 수있는 방법은 무엇입니까?
Etienne Low-Décarie

@ EtienneLow-Décarie : 결과에 따라 unclass사용 data.frame하십시오.
IRTFM

답변:


197

R의 세계에 오신 것을 환영합니다

mtcars  #look at this built in data set
str(mtcars) #allows you to see the classes of the variables (all numeric)

#one approach it to index with the $ sign and the as.factor function
mtcars$am <- as.factor(mtcars$am)
#another approach
mtcars[, 'cyl'] <- as.factor(mtcars[, 'cyl'])
str(mtcars)  # now look at the classes

이것은 문자, 날짜, 정수 및 기타 클래스에서도 작동합니다.

R을 처음 사용하기 때문에 다음 두 웹 사이트를 살펴 보는 것이 좋습니다.

R 참조 매뉴얼 : http://cran.r-project.org/manuals.html

R 참조 카드 : http://cran.r-project.org/doc/contrib/Short-refcard.pdf


감사! 하지만 다른 문제가 있습니다. col_names [] 문자 배열에 각 열의 이름이 있습니다. 나는 위의 명령을 사용하여 (둘 수있는 방법 mydf$col_names[i]mydf[,col_names[i]]일을하지 않습니다.)
Rasoul

1
@Rasoul, mydf[, col_names]이렇게하겠습니다
DrDom

3
심판의 경우 +1 이것은 기본적인 것입니다. 물론 물어볼 수는 있지만 이러한 (및 유사한) 저작물에 포함 된 광범위한 작업을 알고있는 것도 좋습니다.
Roman Luštrik

84
# To do it for all names
df[] <- lapply( df, factor) # the "[]" keeps the dataframe structure
 col_names <- names(df)
# do do it for some names in a vector named 'col_names'
df[col_names] <- lapply(df[col_names] , factor)

설명. 모든 데이터 프레임은 목록이며 [여러 값을 갖는 인수와 함께 사용 된 결과 도 마찬가지로 목록이므로 목록을 반복하는 작업은 다음과 같습니다 lapply. 위의 할당은 함수 data.frame.[<-가 데이터 프레임에 성공적으로 다시 붙여야 하는 일련의 목록을 만듭니다.df

또 다른 전략은 고유 항목의 수가 일부 기준보다 적은 열만 변환하는 것입니다. 예를 들어 행 수의 로그보다 적습니다.

cols.to.factor <- sapply( df, function(col) length(unique(col)) < log10(length(col)) )
df[ cols.to.factor] <- lapply(df[ cols.to.factor] , factor)

이것은 매우 좋은 해결책입니다! 또한 열 번호를 사용하여 작업 할 수 있습니다.이 열 번호는 전부는 아니지만 많이 변경하려는 경우에 특히 유용 할 수 있습니다. 예를 들어, col_nums <-c (1, 6, 7 : 9, 21:23, 27:28, 30:31, 39, 49:55, 57) 다음 df [, col_nums] <-lapply (df [, col_nums] 요인).
WGray

주의 사항 : 첫 번째 해결책은 if 작동하지 않습니다 length(col_names)==1. 이 경우 df[,col_names]길이가 1 인 목록이 아닌 벡터로 자동 강등 된 다음 lapply열 전체가 아닌 각 항목에 대해 작업 을 시도합니다. 를 사용하면이를 방지 할 수 있습니다 df[,col_names,drop=FALSE].
P Schnell

좋은 지적입니다. 목록 상태를 유지하는 다른 호출은를 사용하는 것 df[col_names]입니다.
IRTFM

27

dplyr::mutate_if()모든 문자 열을 변환하거나 dplyr::mutate_at()명명 된 문자 열을 요인으로 선택 하는 데 사용할 수 있습니다 .

library(dplyr)

# all character columns to factor:
df <- mutate_if(df, is.character, as.factor)

# select character columns 'char1', 'char2', etc. to factor:
df <- mutate_at(df, vars(char1, char2), as.factor)

18

data.frame의 모든 문자 변수를 이미 데이터를로드 한 후 요인 으로 변경하려면 다음과 같은 data.frame으로이를 수행 할 수 있습니다 dat.

character_vars <- lapply(dat, class) == "character"
dat[, character_vars] <- lapply(dat[, character_vars], as.factor)

클래스의 열을 식별하는 벡터를 만든 character다음 as.factor해당 열에 적용 합니다.

샘플 데이터 :

dat <- data.frame(var1 = c("a", "b"),
                  var2 = c("hi", "low"),
                  var3 = c(0, 0.1),
                  stringsAsFactors = FALSE
                  )

모든 문자 변수를 인자로 완전히 변환하는 것은 일반적으로 데이터를 읽을 때 발생합니다 (예 : stringsAsFactors = TRUEwith read_excel()). readxl패키지 에서 데이터를 읽은 후 받아들이지 않는 임의의 포리스트 모델을 학습하려는 경우 유용합니다. 문자 변수.
Sam Firke

13

사용할 수있는 또 다른 짧은 방법 %<>%magrittr 패키지 의 파이프 ( )입니다 . 문자 열 mycolumn 을 인수 로 변환합니다 .

library(magrittr)

mydf$mycolumn %<>% factor

자세한 내용으로 편집하십시오. 검색 가능한 콘텐츠가 포함되어 있지 않으며 누군가 "이 작업을 시도해야하는 이유"를 설명하지 않기 때문에 코드 전용 및 "이 작업을 시도"답변은 권장되지 않습니다. 우리는 지식의 원천이되기 위해 노력합니다.
브라이언 톰셋-汤 莱恩

내 df의 모든 열에 사용하지 않으려면 pls?
Mostafa

5

나는 기능으로 그것을하고있다. 이 경우 문자 변수 만 인자로 변환합니다.

for (i in 1:ncol(data)){
    if(is.character(data[,i])){
        data[,i]=factor(data[,i])
    }
}

실제로 열을 추출하고 요소로 바꾸려면 이중 괄호가 필요하다고 생각합니다. 예 :[[i]]
RTrain3k
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.