2015-01-07 3 views
1

фрейм данных, в котором я работаю, содержит много факторов. Возьмите категориальные переменные из mtcars (cyl, vs, am, gear, carb).изменение названия определенных уровней в факторе

head(mtcars[c("cyl","vs","am","gear","carb")]) 
        cyl vs am gear carb 
Mazda RX4   6 0 1 4 4 
Mazda RX4 Wag  6 0 1 4 4 
Datsun 710   4 1 1 4 1 
Hornet 4 Drive  6 1 0 3 1 
Hornet Sportabout 8 0 0 3 2 
Valiant    6 1 0 3 1 

В настоящее время у меня есть два вложенных для петли, чтобы извлечь те уровни, которые встречаются менее чем в 10% времени в конкретном факторе и назначить его на новый уровень имен. Поэтому я хотел бы назначить эти levsl в факторах на новый уровень с именем guz. Есть ли элегантная возможность сделать это?

выход будет представлять собой кадр данных, в котором для вездесущего фактора (предположим, что кол-во выше в наборе данных являются факторами) те строки, которые относятся к уровню, который происходит менее 10 раз, приписываются новому уровню guz , Возьмите уровень 2 в карбюраторе ... это происходит только один раз (лучше 10 процентов, но просто представьте, что это будет так), тогда просто классифицируйте этот уровень в этом fdactor (и все остальные уровни, для которых это верно в коэффициенте) в новый уровень имен guz. Новая карб-колла будет тогда 4,4,1,1, guz, 1.

выход за порог 50% будет

head(mtcars[c("cyl","vs","am","gear","carb")]) 
        cyl vs am gear carb 
Mazda RX4   6 0 1 4 guz 
Mazda RX4 Wag  6 0 1 4 guz 
Datsun 710   guz 1 1 4 1 
Hornet 4 Drive  6 1 0 3 1 
Hornet Sportabout guz 0 0 3 guz 
Valiant    6 1 0 3 1 
+0

Возможно, вам придется использовать 'table', считая, что' df1' является 'data.frame',' lapply (df1, function (x) {x1 <- 100 * prop.table (таблица (x)); (x1) [x1 <10]}) ' – akrun

+2

Ваш Q нуждается в немного уточнении. Таким образом, в mtcars, который имеет 32 строки, вы хотите превратить один из столбцов в коэффициент, а затем реклассифицировать, чтобы любые уровни, составляющие менее 10% (в данном случае 3.2), переименовали данные «guz»? – Spacedman

+0

Я хочу превратить все эти строки в ... sry столбцы в факторы, а затем исключить те уровни, которые происходят менее 10 раз, на новый уровень, называемый guz. поэтому не оставляйте их полностью, а просто меняйте названия уровней. – heint

ответ

2

Первая позволяет сделать столбцы в mtcars в четкие факторы:

cols = c("vs","am","gear","cyl", "carb") 
for(col in cols){mtcars[,col]=factor(paste0(col,mtcars[,col]))} 

Теперь напишем функцию, которая принимает фактор и возвращает фактор с уровнями, реклассифицированными по вашему желанию. Сделать это гибкий с этикеткой и порога:

thresh_factor = function(F, thresh=0.1, label="guz"){ 
     n=length(F) 
     t=table(F) 
     under=t<(n*thresh) 
     levels(F)[under]=label 
     F} 

Теперь это может быть проверено:

> thresh_factor(factor(1:20)) 
[1] guz guz guz guz guz guz guz guz guz guz guz guz guz guz guz guz guz guz guz 
[20] guz 
Levels: guz 

все они становятся guz, потому что каждый из 1:20 уникален. Другие испытания:

> thresh_factor(mtcars$carb) 
[1] carb4 carb4 carb1 carb1 carb2 carb1 carb4 carb2 carb2 carb4 carb4 guz 
[13] guz guz carb4 carb4 carb4 carb1 carb2 carb1 carb1 carb2 carb2 carb4 
[25] carb2 carb1 carb2 carb2 carb4 guz guz carb2 
Levels: carb1 carb2 guz carb4 

Некоторые из уровней там были заменены. Другое испытание:

> thresh_factor(mtcars$cyl) 
[1] cyl6 cyl6 cyl4 cyl6 cyl8 cyl6 cyl8 cyl4 cyl4 cyl6 cyl6 cyl8 cyl8 cyl8 cyl8 
[16] cyl8 cyl8 cyl4 cyl4 cyl4 cyl4 cyl8 cyl8 cyl8 cyl8 cyl4 cyl4 cyl4 cyl8 cyl6 
[31] cyl8 cyl4 
Levels: cyl4 cyl6 cyl8 

И ни один из них не заменен. Выглядит неплохо. Теперь сделайте над всеми столбцами:

> for(col in cols){mtcars[,col]=thresh_factor(mtcars[,col])} 

Просто, чтобы проверить еще раз, используя свой пример вывода, с числовыми уровнями факторов, а 50% Thresh:

> rm(mtcars) # start fresh 
> mtcars=head(mtcars) # first 6 rows for test 
> for(col in cols){mtcars[,col]=factor(mtcars[,col])} # convert columns to factors 

Теперь запустите мой код:

> for(col in cols){mtcars[,col]=thresh_factor(mtcars[,col],thresh=0.5)} 
> head(mtcars[c("cyl","vs","am","gear","carb")]) 
        cyl vs am gear carb 
Mazda RX4   6 0 1 4 guz 
Mazda RX4 Wag  6 0 1 4 guz 
Datsun 710  guz 1 1 4 1 
Hornet 4 Drive  6 1 0 3 1 
Hornet Sportabout guz 0 0 3 guz 
Valiant    6 1 0 3 1 

, который выглядит как ваш ожидаемый выход.

Смежные вопросы