[r] data.frame 열을 인수에서 문자로 변환

데이터 프레임이 있습니다. 전화 해 봅시다 bob:

> head(bob)
                 phenotype                         exclusion
GSM399350 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399351 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399352 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399353 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399354 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399355 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

이 데이터 프레임의 행을 연결하고 싶습니다 (또 다른 질문이 될 것입니다). 그러나보세요 :

> class(bob$phenotype)
[1] "factor"

Bob의 열은 요인입니다. 예를 들어,

> as.character(head(bob))
[1] "c(3, 3, 3, 6, 6, 6)"       "c(3, 3, 3, 3, 3, 3)"
[3] "c(29, 29, 29, 30, 30, 30)"

나는 이것을 이해하기 시작하지 않지만, 이것들이 (Caractacus 왕의 법원의) 기둥의 요인 수준에 대한 지표라고 생각 bob합니까? 내가 필요한 것은 아닙니다.

이상하게도 나는 bob손으로 기둥을 통과 할 수 있고

bob$phenotype <- as.character(bob$phenotype)

잘 작동합니다. 그리고 일부 입력 한 후 열이 요인이 아닌 문자 인 data.frame을 얻을 수 있습니다. 그래서 내 질문은 : 어떻게 자동으로 할 수 있습니까? 요인 열이있는 data.frame을 각 열을 수동으로 거치지 않고 문자 열이있는 data.frame으로 변환하는 방법은 무엇입니까?

보너스 질문 : 왜 수동 접근 방식이 작동합니까?



답변

Matt와 Dirk을 팔로우합니다. 글로벌 옵션을 변경하지 않고 기존 데이터 프레임을 다시 작성하려면 apply 문을 사용하여 해당 데이터 프레임을 다시 작성할 수 있습니다.

bob <- data.frame(lapply(bob, as.character), stringsAsFactors=FALSE)

인자 만 변환하려면 아래의 Marek 솔루션을 참조하십시오 .

@hadley가 지적했듯이 다음은 더 간결합니다.

bob[] <- lapply(bob, as.character)

두 경우 모두 lapply목록을 출력합니다. 그러나 R의 마법 속성으로 인해 []두 번째 경우를 사용 하면 bob객체 의 data.frame 클래스가 유지 as.data.frame되므로 인수를 사용하여 data.frame으로 다시 변환 할 필요가 없습니다 stringsAsFactors = FALSE.


답변

요인 만 바꾸려면

i <- sapply(bob, is.factor)
bob[i] <- lapply(bob[i], as.character)

버전 0.5.0의mutate_if 패키지 dplyr 에는 새로운 기능 이 도입되었습니다 .

library(dplyr)
bob %>% mutate_if(is.factor, as.character) -> bob

RStudio의 패키지 purrr 는 또 다른 대안을 제공합니다.

library(purrr)
library(dplyr)
bob %>% map_if(is.factor, as.character) %>% as_tibble -> bob


답변

글로벌 옵션

stringsAsFactors : data.frame 및 read.table의 인수에 대한 기본 설정입니다.

FALSE시작 파일에서 설정하려는 것이 될 수 있습니다 (예 : ~ / .Rprofile). 참조하십시오 help(options).


답변

요인이 저장되는 방식을 이해하면 적용 기반 함수를 사용하여이를 수행하지 않아도됩니다. 적용 솔루션이 제대로 작동하지 않는다는 의미는 아닙니다.

요인은 ‘수준’목록에 연결된 숫자 색인으로 구성됩니다. 요인을 숫자로 변환하면 볼 수 있습니다. 그래서:

> fact <- as.factor(c("a","b","a","d")
> fact
[1] a b a d
Levels: a b d

> as.numeric(fact)
[1] 1 2 1 3

마지막 줄에 반환 된 숫자는 요인의 수준에 해당합니다.

> levels(fact)
[1] "a" "b" "d"

levels()문자 배열 을 반환합니다. 이 사실을 사용하여 다음과 같이 요인을 문자열 또는 숫자로 쉽고 간단하게 변환 할 수 있습니다.

> fact_character <- levels(fact)[as.numeric(fact)]
> fact_character
[1] "a" "b" "a" "d"

에서 식을 래핑하면 숫자 값에도 적용됩니다 as.numeric().

> num_fact <- factor(c(1,2,3,6,5,4))
> num_fact
[1] 1 2 3 6 5 4
Levels: 1 2 3 4 5 6
> num_num <- as.numeric(levels(num_fact)[as.numeric(num_fact)])
> num_num
[1] 1 2 3 6 5 4


답변

새로운 데이터 프레임하려면 모든 의 요소 벡터 IS는 문자 벡터로 변환을,이 시도 :bobcbobf

bobc <- rapply(bobf, as.character, classes="factor", how="replace")

그런 다음 다시 변환하려면 열이 요인 인 논리 벡터를 만들고이를 사용하여 선택적으로 요인을 적용 할 수 있습니다

f <- sapply(bobf, class) == "factor"
bobc[,f] <- lapply(bobc[,f], factor)


답변

나는 일반적으로이 기능을 모든 프로젝트와 별도로 만듭니다. 빠르고 쉽습니다.

unfactorize <- function(df){
  for(i in which(sapply(df, class) == "factor")) df[[i]] = as.character(df[[i]])
  return(df)
}


답변

다른 방법은 apply를 사용하여 변환하는 것입니다

bob2 <- apply(bob,2,as.character)

그리고 더 좋은 것 (이전의 클래스는 ‘행렬’입니다)

bob2 <- as.data.frame(as.matrix(bob),stringsAsFactors=F)