[r] 서브 세트 데이터 프레임의 드롭 팩터 레벨
을 포함하는 데이터 프레임이 있습니다 factor
. subset
또는 다른 인덱싱 기능을 사용하여이 데이터 프레임의 하위 집합을 만들면 새 데이터 프레임이 만들어집니다. 그러나 factor
변수는 새 데이터 프레임에없는 경우에도 원래 수준을 모두 유지합니다.
패싯 플로팅을 수행하거나 요인 수준에 의존하는 함수를 사용할 때 문제가 발생합니다.
새 데이터 프레임에서 요인에서 수준을 제거하는 가장 간결한 방법은 무엇입니까?
예를 들면 다음과 같습니다.
df <- data.frame(letters=letters[1:5],
numbers=seq(1:5))
levels(df$letters)
## [1] "a" "b" "c" "d" "e"
subdf <- subset(df, numbers <= 3)
## letters numbers
## 1 a 1
## 2 b 2
## 3 c 3
# all levels are still there!
levels(subdf$letters)
## [1] "a" "b" "c" "d" "e"
답변
서브셋 후에 factor ()를 변수에 다시 적용하기 만하면됩니다.
> subdf$letters
[1] a b c
Levels: a b c d e
subdf$letters <- factor(subdf$letters)
> subdf$letters
[1] a b c
Levels: a b c
편집하다
요인 페이지 예에서 :
factor(ff) # drops the levels that do not occur
데이터 프레임의 모든 요인 열에서 수준을 삭제하려면 다음을 사용할 수 있습니다.
subdf <- subset(df, numbers <= 3)
subdf[] <- lapply(subdf, function(x) if(is.factor(x)) factor(x) else x)
답변
R 버전 2.12부터는 droplevels()
기능이 있습니다.
levels(droplevels(subdf$letters))
답변
이 동작을 원하지 않으면 요인을 사용하지 말고 대신 문자형 벡터를 사용하십시오. 나는 이것이 나중에 물건을 패치하는 것보다 더 의미가 있다고 생각합니다. read.table
또는로 데이터를로드하기 전에 다음을 시도하십시오 read.csv
.
options(stringsAsFactors = FALSE)
단점은 알파벳 순서로 제한되어 있다는 것입니다. (재 순서는 줄거리의 친구입니다)
답변
이는 알려진 문제이며, 하나의 가능한 해결책에 의해 제공됩니다 drop.levels()
에 GDATA 귀하의 예제가 될 경우 패키지
> drop.levels(subdf)
letters numbers
1 a 1
2 b 2
3 c 3
> levels(drop.levels(subdf)$letters)
[1] "a" "b" "c"
Hmisc 패키지 에도 dropUnusedLevels
기능 이 있습니다 . 그러나 하위 집합 연산자를 변경해야만 작동하며 여기에는 해당되지 않습니다.[
결과적으로 열별로 직접 접근하는 것은 간단합니다 as.factor(as.character(data))
.
> levels(subdf$letters)
[1] "a" "b" "c" "d" "e"
> subdf$letters <- as.factor(as.character(subdf$letters))
> levels(subdf$letters)
[1] "a" "b" "c"
답변
똑같이하지만 다른 방법으로 dplyr
library(dplyr)
subdf <- df %>% filter(numbers <= 3) %>% droplevels()
str(subdf)
편집하다:
또한 작동합니다! agenis 덕분에
subdf <- df %>% filter(numbers <= 3) %>% droplevels
levels(subdf$letters)
답변
완벽을 위해, 이제이 fct_drop
에 forcats
패키지 http://forcats.tidyverse.org/reference/fct_drop.html .
처리 droplevels
방식 과 다릅니다 NA
.
f <- factor(c("a", "b", NA), exclude = NULL)
droplevels(f)
# [1] a b <NA>
# Levels: a b <NA>
forcats::fct_drop(f)
# [1] a b <NA>
# Levels: a b
답변
다음은 factor(..)
접근 방식 과 동등한 다른 방법입니다 .
> df <- data.frame(let=letters[1:5], num=1:5)
> subdf <- df[df$num <= 3, ]
> subdf$let <- subdf$let[ , drop=TRUE]
> levels(subdf$let)
[1] "a" "b" "c"