Я хочу, чтобы droplevels
dataframe (пожалуйста, не отмечайте этот вопрос как дубликат :)). Учитывая, что все доступные методы доступны только один. Что я делаю не так? Пример:R Факторы передачи данных
> df = data.frame(x = (c("a","b","c")),y=c("d","e","f"))
> class(df$x)
[1] "factor"
> levels(df$x)
[1] "a" "b" "c"
Метод 1 не работает:
> df1 = droplevels(df)
> class(df1$x)
[1] "factor"
> levels(df1$x)
[1] "a" "b" "c"
Метод 2 не работает:
> df2 = as.data.frame(df, stringsAsFactors = FALSE)
> class(df2$x)
[1] "factor"
> levels(df2$x)
[1] "a" "b" "c"
Способ 3 не работает:
> df3 = df
> df3$x = factor(df3$x)
> class(df3$x)
[1] "factor"
> levels(df3$x)
[1] "a" "b" "c"
Метод 4, наконец, работает :
> df4 = df
> df4$x = as.vector(df4$x)
> class(df4$x)
[1] "character"
> levels(df4$x)
NULL
Во время работы я думаю, что метод 4 является наименее элегантным. Можете ли вы помочь мне отладить это? Большое спасибо
EDIT: Следующие комментарии и ответы: Я хочу, чтобы удалить факторную структуру из кадра данных, а не только droplevels
Итак, когда вы говорите, что вы хотите 'droplevels' вы на самом деле просто означает, что вы хотите, чтобы преобразовать переменный фактор Название переменной характер. Если это так, метод 4 является единственным систематически правильным выбором. «droplevels» удаляет ненаблюдаемые уровни из фактора, но в вашем тестовом примере вы наблюдаете все уровни, поэтому ничто не отбрасывается. Если вы не хотите, чтобы они были факторами в первую очередь, используйте 'df = data.frame (x = (c (« a »,« b »,« c »)), y = c (« d », «e», «f»), strAsAsFactors = FALSE). Метод 2 не работает, поскольку они уже являются факторами в этой точке. Что * точно * ваша цель? – MrFlick
@MrFlick, спасибо за объяснение, однако все еще странно, что метод 2 не работает – MasterJedi
@YujiaHu Не странно. Если вы передаете 'as.data.frame', то data.frame все, что он делает, - это отрегулировать атрибут класса и (возможно) имена строк. – joran