함수 - r데이터프레임 변환




data.frame 열을 요소에서 문자로 변환 (9)

글로벌 옵션

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

시작 파일 (예 : ~ / .Rprofile)에서 FALSE 로 설정하고자하는 항목 일 수 있습니다. help(options) 참조하십시오.

데이터 프레임이 있습니다. 그를 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)"

나는 이것을 이해하기 시작하지 않는다. 그러나 나는 이것들이 bob 칼 카락 타스 왕의 궁정의) 기둥의 요소 수준에 대한 지표라고 생각한다. 내가 원하는 건 아니야.

이상하게도 나는 손으로 bob 의 칼럼을 통과 할 수있다.

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

잘 작동합니다. 그리고, 일부 타이핑을 한 후에, 컬럼이 요소가 아닌 문자 인 data.frame을 얻을 수 있습니다. 그래서 내 질문은 : 어떻게 자동으로 할 수 있습니까? 각 열을 수동으로 거치지 않고도 factor 열이있는 data.frame을 문자 열이있는 data.frame으로 변환하려면 어떻게해야합니까?

보너스 질문 : 수동 접근 방식이 작동하는 이유는 무엇입니까?


데이터 프레임의 시작 부분에 stringsAsFactors = FALSE 를 포함하면 모든 오해를 무시할 수 있습니다.


또는 transform 을 시도 할 수 있습니다.

newbob <- transform(bob, phenotype = as.character(phenotype))

문자로 변환하려는 모든 요소를 ​​넣으십시오.

아니면 이런 일을하고 모든 해충을 한 번만 치면됩니다.

newbob_char <- as.data.frame(lapply(bob[sapply(bob, is.factor)], as.character), stringsAsFactors = FALSE)
newbob_rest <- bob[!(sapply(bob, is.factor))]
newbob <- cbind(newbob_char, newbob_rest)

이와 같은 코드에서 데이터를 밀어 sapply 것은 sapply 않습니다. sapply 파트를 별도로 할 수 있습니다. (실제로 그렇게하는 것이 훨씬 쉽습니다.)하지만 요점은 ... 코드를 확인하지 않았습니다. 왜냐하면 나는 집에 없기 때문에 그것이 효과가 있기를 바란다. =)

그러나이 접근법은 단점을 가지고 있습니다 ... transform 후 컬럼을 재구성해야하지만 원하는대로 무엇이든 할 수 있지만 "보행자 스타일 코드 라이팅" 비용은 ...

그래서 거기에 ... =)


매트와 더크를 따라와. 전역 옵션을 변경하지 않고 기존 데이터 프레임을 다시 만들려면 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 을 사용하여 as.data.frame 으로 다시 변환 할 필요가 없습니다. 인수 stringsAsFactors = FALSE 입니다.


이 대답은 조금 늦다는 것을 알고 있지만 요소가 저장되는 방법을 이해하면 적용 기반 함수를 사용하여이를 피할 수 있습니다. 적용 솔루션이 제대로 작동하지 않는다는 것을 의미하지는 않습니다.

요소는 '수준'목록에 연결된 숫자 인덱스로 구성됩니다. 계수를 숫자로 변환하면이 점을 확인할 수 있습니다. 그래서:

> 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

이 함수는 트릭을 수행합니다.

df <- stacomirtools::killfactor(df)

필자는 일반적으로 모든 프로젝트에서이 기능을 분리합니다. 빠르고 쉽습니다.

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

bobc 모든 요소 벡터가 문자 벡터로 변환되는 새로운 데이터 프레임 bobc 를 원한다면 다음을 시도하십시오.

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

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

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

업데이트 : 다음은 작동하지 않는 무언가의 예입니다. 그럴 것이라고 생각 했었지만 stringsAsFactors 옵션은 문자열에서만 작동합니다. 요소 만 남겨 둡니다.

이 시도:

bob2 <- data.frame(bob, stringsAsFactors = FALSE)

일반적으로 말하자면, 캐릭터가되어야하는 요소에 문제가있을 때마다 stringsAsFactors 어딘가에 도움을주기 위해 설정됩니다 (전역 설정 포함).





dataframe