R изменить уровни факторов переменной и удалить старые

У меня есть большой набор данных, который читается из файла SPSS. Он содержит несколько строк и столбцов, считанных из множества небольших SPSS файлов. Файл SPSS содержит некоторые ошибки, которые я хочу исправить в R. Когда данные читаются, они имеют все шумы в уровнях фактора, но в SPSS данные в порядке. Я не могу изменить уровни фактора во многих отдельных файлах в SPSS. Ниже приведен небольшой образец данных, которые у меня есть

data
    a  b                   c                  d    e
[1] 3  5 1 Very dissatisfied                  5    5
[2] 8  3                  10         Don't Know    1
[3] 7  5                   3                  8    6
[4] 3  5                   9                  6   99
[5] 9  4                   8  10 Very Satisfied    3
[6] 5 NA       99 Don't Know     Very Satisfied   10

levels(data[,1])
 [1] "1 Very Dissatisfied" "2"                 "3"             "4"                
 [5] "5"                   "6"                 "7"             "8"                
 [9] "9"                   "1" "10 Very Satisfied" "99 Don't know"
[12] "1 Very Bad"        "99"       "2 Satisfied"             "10"

Уровни содержат много ошибок. Я хочу исправить их на что-то вроде следующего

x<-factor()
x<-ordered(x,levels=c("1 Very Dissatisfied","2 Satisfied","3 Satisfied","4 Satisfied",
"5 Satisfied","6 Satisfied","7 Satisfied","8 Satisfied","9 Satisfied","10 Very Satisfied",
"99 Dont Know"))

levels(x)
[1] "1 Very Dissatisfied"  "2 Satisfied"         "3 Satisfied"    "4 Satisfied"      
[5] "5 Satisfied"          "6 Satisfied"         "7 Satisfied"    "8 Satisfied"      
[9] "9 Satisfied"          "10 Very Satisfied"  "99 Dont Know"

Я пробовал следующий код

for(j in c(1,2,5)){
    data[,j] <- factor(data[,j], levels = c(levels(data[,j]), levels(x)))
    for(i in 2:9){
        data[grep(i,data[,j]),j] <- paste(i,"Satisfied")}
}

Это не работает. Покажите, пожалуйста, где я не прав и что мне делать.

Даже после того, как этот код заработает, я должен удалить неиспользуемые факторы мусора, которые содержит переменная. Как это сделать?


person Prabhu    schedule 09.11.2014    source источник


Ответы (3)


  1. Очистите свои данные. Это оставит только числа и NA.

    data=apply(data,1:2,function(x) gsub("[^0-9]", "",x))
    

    Данные будут такими:

          a   b   c    d    e   
    
    [1,] "3" "5" "1"  "5"  "5"     
    [2,] "8" "3" "10" "99" "1"   
    [3,] "7" "5" "3"  "8"  "6"   
    [4,] "3" "5" "9"  "6"  "99"  
    [5,] "9" "4" "8"  "10" "3"   
    [6,] "5" NA  "99" "10" "10"  
    
  2. Перекодируйте свою строку.

    # Install the car package
    install.packages("car")
    
    
    # Load the car package     
    library("car")
    
    replace_string=function(x) {  
    recode(x,'1="1 Very Dissatisfied";  
              2="2 Satisfied";  
              3="3 Satisfied";  
              4="4 Satisfied";   
              5="5 Satisfied";  
              6="6 Satisfied";  
              7="7 Satisfied";  
              8="8 Satisfied";  
              9="9 Satisfied";  
             10="10 Very Satisfied";   
             99="99 Dont Know"')  
     }  
    
     data=apply(data,1:2,replace_string)  
    
person field210    schedule 09.11.2014
comment
Ваш ответ хорош, но не очень подходит мне, потому что мои данные содержат шумы. Я использовал другое решение. - person Prabhu; 09.11.2014

Я бы предложил оставить атрибуты SPSS как есть, не используя метки значений из SPSS:

temp <- read.spss(file, use.value.labels = FALSE)

Затем я бы использовал ifelse для исправления меток на основе вашего цикла for:

temp$c <- ifelse(as.numeric(temp$c) %in% 1:9, paste(temp$c, "Satisfied", sep=" "), temp$c)
person Stedy    schedule 09.11.2014
comment
Есть много столбцов, которые правильно считываются из SPSS как фактор, и еще много столбцов, которые не являются правильным фактором. Мой вопрос: можем ли мы выборочно читать столбцы, используя use.value.labels=TRUE/FALSE из SPSS, чтобы применить ваше предложение? - person Prabhu; 09.11.2014
comment
Без файлов сложно сказать. По своему опыту я обнаружил, что факторов следует избегать любой ценой, кроме как при построении графика. Я предпочитаю использовать векторы в качестве символов, чтобы уменьшить головную боль, но это именно то, что работает для меня. - person Stedy; 09.11.2014
comment
Я использую эти данные для построения графика, и они генерируют много шума, поэтому я хочу правильно их учесть. - person Prabhu; 09.11.2014

Точка, где я допустил ошибку, была в grep. Я использовал grep(^i$,data) вместо grep(i,data). Это захватило как 1, так и 10, а также 9 и 99. Я использовал ^i$ для точного соответствия символу, чтобы ^9$ захватывало только 9, а не 99.

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

Я использовал следующий код, чтобы исправить себя:

Шаг 1: Определите уровни фактора

x<-factor()
x<-ordered(x,levels=c("1 Very Dissatisfied","2 Satisfied","3 Satisfied","4 Satisfied","5 Satisfied","6 Satisfied","7 Satisfied","8 Satisfied","9 Satisfied","10 Very Satisfied","Dont Know"))

Шаг 2: Теперь прокрутите все столбцы данных и строки.

Я использовал следующий код:

for(j in c(28,29,32)){
    data[,j]<-factor(data[,j])
    #add required levels so that when introduced later, does not introduce NA
    data[,j] <- factor(data[,j], levels = c(levels(data[,j]), levels(x)))
    #Now remove and correct noises
    data[grep("99",data[,j]),j] <- "Dont Know"
    data[grep("Don",data[,j]),j] <- "Dont Know"
    data[grep("Very [Ss]",data[,j]),j] <- "10 Very Satisfied"
    data[grep("10",data[,j]),j] <- "10 Very Satisfied"
    data[grep("Very [Dd]",data[,j]),j] <- "1 Very Dissatisfied"
    data[grep("^1$",data[,j]),j] <- "1 Very Dissatisfied"
    #Loop through remaining data and correct
    for(i in 2:9){
       data[grep(paste("^",i,"$",sep=""),data[,j]),j] <- paste(i,"Satisfied")
    }
    #to remove unused factors, ordered
    data[,j]<-ordered(data[,j],levels(x))
}
person Prabhu    schedule 09.11.2014