установка уровней внутри цикла Лаппи в г - PullRequest
1 голос
/ 09 сентября 2010

Я пытаюсь очистить факторные переменные в кадре данных из конечных пробелов.Однако назначение уровней не работает внутри моей функции lapply.

rm.space<-function(x){
    a<-gsub(" ","",x)
    return(a)}


lapply(names(barn),function(x){
    levels(barn[,x])<-rm.space(levels(barn[,x]))
    })

Есть идеи, как назначить уровни внутри функции lapply?

// M

Ответы [ 3 ]

6 голосов
/ 09 сентября 2010

R векторизовано, вам не нужно apply():

> f <- as.factor(sample(c("  a", " b", "c", "  d"), 10, replace=TRUE))                                                                                                             
> levels(f)                                                                                                                                                                        
[1] "  a" " b"  "c"   "  d"                                                                                                                                                        
> levels(f) <- gsub(" +", "", levels(f), perl=TRUE)                                                                                                                                
> levels(f)                                                                                                                                                                        
[1] "a" "b" "c" "d"                                                                                                                                                                
> f                                                                                                                                                                                
 [1] d a c b c d d a a a                                                                                                                                                           
Levels: a b c d                                                                                                                                                                    
>
1 голос
/ 09 сентября 2010

Из вашего кода я прочитал, что lapply используется для зацикливания разных переменных, а не уровней фактора.Тогда вам нужна какая-то циклическая структура, но lapply - плохой выбор:

  • вы перебираете вектор-имена (сарай) - так что лучше использовать sapply
  • Семейство apply будет возвращать результат из каждого цикла, чего вы не хотите.Таким образом, вы используете память без цели.

В любом случае, если вам нужно присвоить что-то переменной в вашей глобальной среде внутри приложения, вам нужен оператор << -.Скажем, вам нужно иметь несколько переменных, которые вы выбрали для удаления пробелов: </p>

f <- paste("",letters[1:5])

Df <- data.frame(
    X1 = sample(f,10,r=T),
    X2 = sample(f,10,r=T),
    X3 = sample(f,10,r=T)
    )

# Bad example :   
lapply(c("X1","X3"),function(x){
    levels(Df[,x])<<-gsub(" +","",levels(Df[,x]))
    })

дает

> str(Df)
'data.frame':   10 obs. of  3 variables:
 $ X1: Factor w/ 3 levels "a","b","c": 2 3 1 1 1 2 3 2 2 2
 $ X2: Factor w/ 5 levels " a"," b"," c",..: 4 5 4 2 5 5 1 2 5 3
 $ X3: Factor w/ 5 levels "a","b","c","d",..: 2 3 4 1 4 1 3 3 5 4

Лучше использовать цикл for:

for( i in c("X1","X3")){
    levels(Df[,i])<-gsub(" +","",levels(Df[,i]))
}

Делает то, что вам нужно, без хлопот оператора << - и без лишнего хранения памяти. </p>

0 голосов
/ 09 сентября 2010

Как утверждает Джорис, lapply работает с локальной копией data.frame, поэтому она не изменит ваши исходные данные. Но вы можете использовать его для замены ваших данных:

barn[] <- lapply(barn, function(x) {
    levels(x) <- rm.space(levels(x))
    x
    })

Это полезно, если у вас есть разные типы данных и вы хотите изменить только factor, например ::100100

factors <- sapply(barn, is.factor)
barn[factors] <- lapply(barn[factors], function(x) {
                    levels(x) <- rm.space(levels(x))
                    x
                 })
...