Уровни установки внутри LOP LOPLY в R
Вопрос
Я пытаюсь очистить переменные фактора в 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
})