2017-01-22 4 views
0

Hmisc代償モデルでデータフレームを代入しようとしています。一度に1つの列のデータを代入することはできますが、列をループすることはできません。例以下はRでデータを代入するために各列をループしますが、帰属データは置き換えません

- 正常に動作しますが、私は、関数を使用して、それを動的にしたいと思います:私は、関数を実行するエラーはありませんが、ノーあり

impute_dataframe <- function() 
{ 
    for(i in 1:ncol(impute_marks)) 
    { 
    impute_marks[is.na(impute_marks[,i]), i] <- with(impute_marks, round(impute(impute_marks[,i], mean)),0) 
    } 
} 
impute_dataframe 

impute_marks$col1 <- with(impute_marks, round(impute(col1, mean)),0) 

例データをimpute_marksデータセットにも帰属させます。

答えて

1

Hmisc::imputeはなぜちょうどapplyを使用してforループを保存しないで、すでに機能です?:

library(Hmisc) 
age1 <- c(1,2,NA,4) 
age2 <- c(NA, 4, 3, 1) 
mydf <- data.frame(age1, age2) 

mydf 
    age1 age2 
1 1 NA 
2 2 4 
3 NA 3 
4 4 1 

apply(mydf, 2, function(x) {round(impute(x, mean))}) 
    age1 age2 
1 1 3 
2 2 4 
3 2 3 
4 4 1 

EDIT:あなたはこのようにそれをバックcoherceできdata.frameとしてmydfを保つために:

mydf <- as.data.frame(mydf) 

しかし、私は、この適用/マッピングの考え方にぴったり合ったもう1組のパッケージpurrrを使用しています。例えばmap_dfはいつも、私はベースRの機能を使用することが好ましい知っているあなたは?map

library(purrr) 
map_df(mydf, ~ round(impute(., mean))) 

で見ることができますmap_xの束があり、data.frameオブジェクトを返しますが、purrrはそんなに簡単applyスタイルの操作を行い。

+1

私はかなりRの新しいです。私は適用機能を認識していませんでした。それを指摘してくれてありがとう。私は欲しいものを達成することができましたが、操作の最後にデータフレームではなくマトリックスを取得します。私はそれをデータフレームに変換することができます。これは私が得たものです:num [1:153、1:26] 55 68 ....すべての値。 153 obsよりむしろ。 26変数 –

+0

これをたくさん見つけた場合は、as.data.frame() –

+0

を使用して右側全体をラップすることで解決されました。 'library(purrr)'をチェックしてください。これは構文がよく、より直感的ですベースの 'apply'、' lapply'などの関数よりも – Nate

1

我々はna.aggregatemeanを与え、デフォルトではlapply

mydf[] <- lapply(mydf, function(x) round(na.aggregate(x))) 

で別々のデータセット

library(zoo) 
round(na.aggregate(mydf)) 
# age1 age2 
#1 1 3 
#2 2 4 
#3 2 3 
#4 4 1 

または各列の上で直接適用することができるzooからna.aggregateを使用することができます。しかし、私たちは変更することができますFUN

関連する問題