2010-10-06 2 views

ответ

13

Кто-нибудь пробовал использовать этот простой метод? Это не требует специальных пакетов, просто понимание того, как R влияет на факторы.

Допустим, вы хотите переименовать уровни в фактор, получить их индексы

data <- data.frame(a=letters[1:26],1:26) 
lalpha <- levels(data$a) 

В этом примере мы представим себе, мы хотим знать индекс для уровня «е» и «ж»

lalpha <- levels(data$a) 
ind <- c(which(lalpha == 'e'), which(lalpha == 'w')) 

Теперь мы можем использовать этот индекс, чтобы заменить уровни фактора «а»

levels(data$a)[ind] <- 'X' 

Если вы теперь посмотрите на д ataframe фактор a будет там, где был e и w

Я оставляю его вам, чтобы попробовать результат.

14

Одним из вариантов является recode() функция в пакете car:

require(car) 
df <- data.frame(a=letters[1:26],1:26) 
df2 <- within(df, a <- recode(a, 'c("a","b","c")="a"')) 
> head(df2) 
    a X1.26 
1 a  1 
2 a  2 
3 a  3 
4 d  4 
5 e  5 
6 f  6 

Пример, где a не так просто, и мы перекодировать несколько уровней в один.

set.seed(123) 
df3 <- data.frame(a = sample(letters[1:5], 100, replace = TRUE), 
        b = 1:100) 
with(df3, head(a)) 
with(df3, table(a)) 

последние строки, дающие:

> with(df3, head(a)) 
[1] b d c e e a 
Levels: a b c d e 
> with(df3, table(a)) 
a 
a b c d e 
19 20 21 22 18 

Теперь позволяет объединить уровни a и e на уровень Z используя recode()

df4 <- within(df3, a <- recode(a, 'c("a","e")="Z"')) 
with(df4, head(a)) 
with(df4, table(a)) 

, который дает:

> with(df4, head(a)) 
[1] b d c Z Z Z 
Levels: b c d Z 
> with(df4, table(a)) 
a 
b c d Z 
20 21 22 37 

Делая это, не изложив уровни сливаться:

## Select the levels you want (here 'a' and 'e') 
lev.want <- with(df3, levels(a)[c(1,5)]) 
## now paste together 
lev.want <- paste(lev.want, collapse = "','") 
## then bolt on the extra bit 
codes <- paste("c('", lev.want, "')='Z'", sep = "") 
## then use within recode() 
df5 <- within(df3, a <- recode(a, codes)) 
with(df5, table(a)) 

Который дает нам так же, как df4 выше:

> with(df5, table(a)) 
a 
b c d Z 
20 21 22 37 
+0

Нужно ли быть приказанным фактором, чтобы иметь возможность использовать это? –

+0

@Brandon: нет, и в приведенном выше примере он не был упорядочен с точки зрения 'with (df, is.ordered (a))'. Я добавлю еще один пример, показывающий, что 'a' не так прост, как ваш оригинал. –

+0

Я имел в виду в правильном порядке, а не приказал. Ты прав. –

3

Вы могли бы сделать что-то вроде:

df$a[df$a %in% c("a","b","c")] <- "a" 

ОБНОВЛЕНИЕ: Более сложные факторы.

Data <- data.frame(a=sample(c("Less than $50,000","$50,000-$99,999", 
    "$100,000-$249,999", "$250,000-$500,000"),20,TRUE),n=1:20) 
rows <- Data$a %in% c("$50,000-$99,999", "$100,000-$249,999") 
Data$a[rows] <- "$250,000-$500,000" 
+0

Это хорошо работает для примера, который я предоставил, но он ломается, как только я пытаюсь использовать более сложные имена факторов –

+0

@Brandon не могли бы вы привести пример «более сложных имен факторов»? –

+0

«Менее 50 000 долларов», «50 000 - 99 999 долларов», «100 000 - 249 999 долларов», «250 000 - 500 000 долларов США» –

2

есть два пути. Если вы не хотите отказаться от неиспользуемых уровней, то есть «b» и «c», решение Joshua, вероятно, лучше всего.

если вы хотите отказаться от неиспользуемых уровней, а затем

df$a<-factor(ifelse(df$a%in%c("a","b","c"),"a",as.character(df$a))) 

или

levels(df$a)<-ifelse(levels(df$a)%in%c("a","b","c"),"a",levels(df$a)) 
0

Это упрощенная версия выбранного ответа:

Я обнаружил, что самый простой способ справиться с этим просто перезаписать уровни фактора, глядя на них, а затем писать цифры вниз, чтобы быть перезаписаны ,

df <- data.frame(a=letters[1:26],1:26) 
levels(df) 

> [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" 
"p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z" 

levels(df$a)[c(1,2)] <- "c" 
summary(df$a) 

> c d e f g h i j k l m n o p q r s t u v w x y z 
    3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
Смежные вопросы