2017-03-12 5 views
0

データフレーム(hp)にはNA-sを持つ列が何個含まれていますか?これらの列のクラスはfactorです。最初に私はそれを文字に変更し、NA-sに "none"を記入して元に戻します。私は14の列を持っているので、私はループでそれを作りたいと思います。しかし、それは動作しません。データフレームのNA-s個以上の列を変更する

お願いします。

列:

miss_names<-c("Alley","MasVnrType","FireplaceQu","PoolQC","Fence","MiscFeature","GarageFinish",  "GarageQual","GarageCond","BsmtQual","BsmtCond","BsmtExposure","BsmtFinType1", 
      "BsmtFinType2","Electrical") 

ループ:

for (i in miss_names){  
    hp[i]<-as.character(hp[i]) 
    hp[i][is.na(hp[i])]<-"NONE" 
    hp[i]<-as.factor(hp[i]) 
    print(hp[i]) 
    } 

Error in sort.list(y) : 'x' must be atomic for 'sort.list' 
Have you called 'sort' on a list? 
+0

再現可能な例を示してください。理想的には 'dput'を使用してhpオブジェクトのいくつかの行を追加します。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

答えて

1

使用addNA()因子レベルとしてNAを追加して、あなたが好きで、そのレベルを交換します。最初に要素を文字ベクトルに変換する必要はありません。データフレーム内のすべての要素をループし、1つずつ置き換えることができます。

# Sample data 
dd <- data.frame(
    x = sample(c(NA, letters[1:3]), 20, replace = TRUE), 
    y = sample(c(NA, LETTERS[1:3]), 20, replace = TRUE) 
) 

# Loop over the columns 
for (i in seq_along(dd)) { 
    xx <- addNA(dd[, i]) 
    levels(xx) <- c(levels(dd[, i]), "none") 
    dd[, i] <- xx 
} 

これは、私たち

> str(dd) 
'data.frame': 20 obs. of 2 variables: 
$ x: Factor w/ 4 levels "a","b","c","none": 1 4 1 4 4 1 4 3 3 3 ... 
$ y: Factor w/ 4 levels "A","B","C","none": 1 1 2 2 1 3 3 3 4 1 ... 
+0

ソリューションに感謝します。 – deaux

0

にヨハン・ラーション@と同じデータを使用してpurrrライブラリを使用して代替ソリューションを提供します:

library(purrr) 
 

 
set.seed(15) 
 
dd <- data.frame(
 
     x = sample(c(NA, letters[1:3]), 20, replace = TRUE), 
 
     y = sample(c(NA, LETTERS[1:3]), 20, replace = TRUE)) 
 

 
# Create a function to convert NA to none 
 
convert.to.none <- function(x){ 
 
     y <- addNA(x) 
 
     levels(y) <- c(levels(x), "none") 
 
     x <- y 
 
     return(x) } 
 

 
# use the map function to cycle through dd's columns 
 
map_df(dd, convert.2.none)

は、スケーリングを可能にしますあなたの仕事。

関連する問題