Вопрос

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

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


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

Любые идеи, как я могу назначить уровни внутри функции Lapply?

// М.

Это было полезно?

Решение

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

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

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

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

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

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

Делает то, что вам нужно без хлопот << - оператора и не удерживая память без необходимости.

Другие советы

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                                                                                                                                                                    
>

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

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

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

factors <- sapply(barn, is.factor)
barn[factors] <- lapply(barn[factors], function(x) {
                    levels(x) <- rm.space(levels(x))
                    x
                 })
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top