2016-03-15 7 views
1

Мои переменные в моей кадре данных имеют наблюдения характера (не уверен, что это правильный способ выразить это, по сути, данные перечислены как «chr», когда я вытягиваю структуру).Избирательные переменные с менее чем двумя факторами

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

Это моя идея. Я знаю, что циклы for являются табу в R, но я довольно новый, и для меня имеет смысл использовать его.

x = as.character(c("Not Sampled", "Not Sampled", "Y", "N")) 
y = as.character(c("Not Sampled", "Not Sampled", "Not Sampled", "Not Sampled")) 
z = as.character(c("Y", "N", "Not Sampled", "Y")) 
df = data.frame(x, y, z) 

for i in df: 
    df$Response = as.factor(df[,i]) #create new variable in dataframe 
    df$Response = [email protected][sapply .... #where I think I can separate out the variables I want and the variables I don't want 

    m1 = lm(response ~ 1) #next part where I want only the selected variables 

Я знаю, что решение, вероятно, намного сложнее, но это моя неоперившаяся попытка.

ответ

2
library(dplyr) 

df <- df %>% lapply(factor) %>% data.frame() 
df[ , sapply(df, n_distinct) >= 2] 
+0

Вау, это огромная подсказка, спасибо! – userfriendly

+2

Вам не нужен dplyr для этого подхода. (вы можете использовать 'mutate_each', если хотите использовать dplyr) –

4

Метод data.frame по умолчанию преобразует строки в факторы, поэтому дополнительное преобразование в этом случае не требуется. lapply лучше для сравнения уровней, так как sapply попытается упростить возвращаемое значение для матрицы, если длины одинаковы.

df = data.frame(x, y, z) 

## Already factors, use sapply(df, typeof) to see underlying representation 
sapply(df, class) 
#  x  y  z 
# "factor" "factor" "factor" 

## These are the indicies with > 2 levels 
lengths(lapply(df, levels)) > 2 
# x  y  z 
# TRUE FALSE TRUE 

## Extract only those columns 
df[lengths(lapply(df, levels)) > 2] 
+0

Кажется, что это мне поможет. Я попытался скопировать и вставить его, чтобы проверить его, но я не уверен, что «длина» - это другая функция или если это опечатка базовой «длины». Я на 99% уверен, что это последнее, но для потомков я хотел уточнить. – userfriendly

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

  • Нет связанных вопросов^_^