1

データフレーム内の因子変数を末尾のスペースから削除しようとしています。ただし、レベルの割り当ては、私の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

4

3 に答える 3

6

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                                                                                                                                                                    
>
于 2010-09-09T00:32:07.820 に答える
1

あなたのコードから、因子のレベルではなく、さまざまな変数をループするためにlapplyが使用されていることがわかりました。したがって、ある種のループ構造が必要ですが、lapplyは悪い選択です。

  • ベクトル-names(barn)-をループするので、sapplyを使用することをお勧めします
  • applyファミリーは、各ループからの結果を返しますが、これは望ましくありません。つまり、目的のないメモリを使用しているのです。

とにかく、ラップリー内のグローバル環境の変数に何かを割り当てる必要がある場合は、<<-演算子が必要です。スペースを削除する必要がある場所で、選択したいくつかの変数が必要だとします。

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]))
}

<<-演算子の手間をかけずに、またメモリを不必要に保持することなく、必要なことを実行します。

于 2010-09-09T08:23:11.750 に答える
0

Jorisが述べているよう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
                 })
于 2010-09-09T10:14:08.340 に答える