2015-02-27 6 views
1

У меня есть еще одна проблема и надеюсь на вашу помощь. Я уже поступил в googled, спросил друга и попытался понять похожие проблемы/вопросы вокруг этого сайта, но я до сих пор не могу понять ...как преобразовать фактор-переменную в числовое значение - с помощью R

Хорошо, вот моя проблема: У меня есть большой набор данных, который охватывает данные за период с 1980 по 2012 год. Я использовал read.spss функцию, чтобы получить данные в R

rohdaten <-read.spss("C:\\Users\\xxxxxxx.sav", use.value.labels = TRUE, to.data.frame = TRUE, 
     max.value.labels = Inf, trim.factor.names = FALSE, 
     trim_values = TRUE, reencode = NA, use.missings = TRUE) 

Это, кажется, работает. Затем я хотел бы проанализировать переменную 14 (v14), которая является шкалой смешения, исходящей из «полностью согласного» с «не соглашаться вообще» и поэтому кодируется как фактор. Я хотел бы сравнить изменение ответов с этим шкалом со знаком с течением времени, и поэтому я хочу рассчитать среднее значение этого, и для этого он должен быть числовым. Это первый шаг в проблеме ... Согласно R for Dummies Мне нужно сначала изменить множитель на символ, а затем изменить его на числовое. Хорошо ... вот мой код ... Прежде всего, я попробовал функцию recode(), которая не сработала - тогда я просто продолжил и создал новый объект «econ», который называет экземпляр переменной14 в копии. (Так что я не влияю на исходные данные V14 в рабочей области)

rohdaten$v14_2 <- recode(rohdaten$v14, "8 = NA; 9 = NA; 0 = NA; 1 = 1; 2 = 2; 3 = 3; 4 = 4; 5 = 5; as.factor.result = FALSE") #should recode already - kinda doesn't work 
class(rohdaten$v14_2) #just tells me it's a factor... 
str(rohdaten$v14_2) 
econ <- rohdaten$v14_2 

С «для чайников-сайта» в виде изменить вещи в символы, а затем в цифровую

str(econ) 
as.character(econ) 
head(econ) 
econ <- as.numeric(econ) 
head(econ) 

Этого по какой-то причине дает мне «хороший» результат, несмотря на «ошибку» (??) в строке «как символ» ... Если я иду с econ <- as.character(econ) - я получаю «Предупреждающее сообщение: NAs, введенные принуждением» после econ <- as.numeric(econ) ...

Хорошо, пока это работает как-то, я думаю !?

Но я хочу, чтобы вычислить среднее за каждый год (который находится в переменной 2) , и я наткнулся на функцию by(), которая выглядела, как это делает именно то, что я хочу, так что мой код оказался:

avgEconRat <- by(data = rohdaten, INDICES = rohdaten$v2, FUN = mean, na.rm = T) 
head(avgEconRat) #actually gives me some means - not sure though whether it's the real means or the means of the "factor-number" that's mentioned in the "for-dummies-website" - sorry I can't explain it better :-(

Теперь у меня есть данные в объекте avgEconRat, но в первую очередь я не уверен, правильно ли я имею в виду, а во-вторых, и это как-то главная проблема, как я могу ссылаться на мои данные теперь для его построения?

p1 <- ggplot(na.action=na.exclude, rohdaten, aes(v14, v2)) 
p1 + geom_point(aes(color = v652), alpha = 0.6) + 
     facet_grid(. ~ v5) 

Вот код, который я имел в виду, - и я знаю, что я должен был бы заменить «rohdaten» с «Econ» сейчас, но так как я понятия не имею, как «Econ» структурирован (а также Дон» я действительно знаю, как это выяснить), я абсолютно застрял здесь: -/ Я чувствую, что у меня есть (или, возможно, в зависимости от того, являются ли мои средства правильными ...) данные, которые мне нужны, но как-то потерянный доступ к Это.

Прошу прощения за мои странные проблемы, но обучение программированию без реального наставничества является чем-то трудным без какого-либо предыдущего опыта.

Большое спасибо за ваше терпение, время и помощь!

+0

Неужели http://stackoverflow.com/questions/3418128/how-to-convert-a-factor-to-an-integer-numeric-without-a-loss-of-information не помогает? Без набора данных [воспроизводимого] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) нелегко сказать, что может происходить в вашем конкретном случае , Кажется, что хотя бы одно из ваших значений не похоже на число R. – MrFlick

ответ

2

Во-первых, вот почему вы должны преобразовать в символ перед преобразованием в цифровой:

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

x = factor(c(1,2,7,7)) 

вы можете проверить, как это представлено в R нравится так:

unclass(x) 
#> [1] 1 2 3 3 
#> attr(,"levels") 
#> [1] "1" "2" "7" 

, и вы увидите, что есть 3 уровня, и что значения представлены в виде индексов в этих 3-х уровнях. Кроме того, если вы звоните as.numeric() напрямую, вы получите вектор индекса, а не значение вы надеялись:

as.numeric(x) 
#> [1] 1 2 3 3 

С другой стороны, если у вас есть Лайкерт масштаб, а уровни фактора находятся в правильном порядке:

f = factor(c("agree","agree","somewhat agree","somewhat agree","somewhat disagree","disagree","disagree")) 

levels(f) 
#> [1] "agree" "disagree" "somewhat agree" "somewhat disagree" 

вы можете на самом деле хотите индекс:

#> as.numeric(f) 
[1] 1 1 3 3 4 2 2 

Если, однако, ваши уровни по порядку, как в:

f = factor(sample(c("agree","somewhat agree","somewhat disagree","disagree"), 
        20, 
        TRUE)) 
levels(f) 
#> [1] "agree" "disagree" "somewhat agree" "somewhat disagree" 

то вместо вызова as.numeric(as.character(f)) (что не имеет смысла в данном случае), вы хотите, чтобы изменить порядок уровней факторов, а затем вызвать as.numeric, например, так:

as.numeric(factor(f, 
        # specifify the levels in the correct order: 
        levels=c("agree","somewhat agree","somewhat disagree","disagree")) 
+0

Этот ответ - очень хороший учебник по использованию факторов для порядковых данных. И эта вещь «unclass» для меня нова и выглядит удобной. Благодаря! – Frank

+0

Спасибо за помощь - это заняло некоторое время O :-) – RJW

0

У меня была аналогичная проблема с набором данных с 1988-2012 года, но я пытался изменить имена переменных в числа. После нескольких часов попыток разных комбинаций - я тоже очень новичок в R - я нашел следующее решение.

Сначала я делал это:

это требует пакет «plyr»

library(plyr) 
my.data2$islamic_leviathan_score <- revalue(my.data2$islamic_leviathan, 
       c("(1) Very Suitable"="3", "(2) Suitable"="2", "(3) Somewhat Suitable"="1", "(4) Not Suitable At All"="-1")) 

Значения были правы, но R не признавала переменную как числовой один. Поэтому невозможно было провести гистограмму или регрессию.

Тогда я сделал это:

исламская Левиафан

my.data2$islamic_leviathan <- c("3", "2", "1", "-1") 

my.data2$islamic_leviathan_score <- as.factor(my.data2$islamic_leviathan) 
my.data2$islamic_leviathan_score 

my.data2$islamic_leviathan_score_1 <-as.numeric(as.character(my.data2$islamic_leviathan_score)) 

my.data2$islamic_leviathan_score_1 

Эта операция меняла переменную из фактора в числовой один, но проблема заключается в том, что результаты (значения переменной) были изменены после этой операции, и поэтому мои результаты были совершенно неправильными.

То, что я только что сделал й, который, казалось, чтобы решить эту проблему-это:

library(plyr) 
my.data2$islamic_leviathan_score <- revalue(my.data2$islamic_leviathan, 
       c("(1) Very Suitable"="3", "(2) Suitable"="2", "(3) Somewhat Suitable"="1", "(4) Not Suitable At All"="-1")) 

my.data2$islamic_leviathan_score_1 <- as.numeric(as.character(my.data2$islamic_leviathan_score)) 

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

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

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