2017-07-13 2 views
0

私はRがとても新しいので、やさしくしてください。NAをNに置き換えるコードを完成させる方法R

私はRに入って仕事をしてくれるKaggle Titanicコンペで仕事をしています。

私は自分のやり方で機能を設計しています。私は次に何をすべきかの論理にちょっと固執しています。

だから、ここに行きます。私の目標は年齢データを取ってNAのすべてを人物のタイトルの年齢中央値に置き換えることです。例えばその人がマスターであれば、すべてのマスターのメジアンを取得し、NAをそのメジアンに置き換えたいと思います。 Mr.さんと同じように。

私は次のように自分自身にタイトルや年齢を含むdata.frameを作成するために管理している:

library(tibble) 
data.combined <- 
    tibble(
    data.combined.new.title = c(
     "Mr.", 
     "Mrs.", 
     "Miss", 
     "Mrs.", 
     "Mr.", 
     "Mr.", 
     "Mr.", 
     "Master", 
     "Mrs." 
    ), 
    data.combined.Age = c(22, 38, 26, 35, 35, NA, 54, 2, 27) 
) 

enter image description here

このリストで見ることができるようにと氏とNAが隣にあり彼の歳。そのNAをリストの他のすべてのMrの中央値に置き換えたいと思います。

私は以下のコードを使って、NAをデータセット全体の中央値に置き換えることができます。私はちょうど得ることはありません何

#Creates my data.frame 
agedata <- data.frame(data.combined$new.title, data.combined$Age) 

#replace NA with the mean of the whole data set 
agedata$data.combined.Age[is.na(agedata$data.combined.Age)] <- median(agedata$data.combined.Age, na.rm = TRUE) 

、私はタイトルのグループの中央値によってNAを置き換えるために、このコードに追加する方法です氏、マスター、夫人、ミス?

すべてのポインタが大きく受信されます。

私はこの時点でKaggleの予測に役立つかどうか、コードがどのように見えるかについてはあまり興味がありません。

Many Thanks in Advance。

+1

最も簡単なのは 'na.aggregate'だと思いますすなわち、 (群れ)%> mutate(形質= na.aggregate(形質、FUN =中央値)) ' – akrun

答えて

1

それとも、このtidyverseワンライナー

agedata %>% group_by(title) %>% mutate(age=ifelse(is.na(age), median(age, na.rm=TRUE), age)) 
2
zz <- "group traits 
BSPy01-10  NA 
BSPy01-10 7.3 
BSPy01-10 7.3 
BSPy01-11 5.3 
BSPy01-11 5.4 
BSPy01-11 5.6 
BSPy01-11  NA 
BSPy01-11  NA 
BSPy01-11 4.8 
BSPy01-12 8.1 
BSPy01-12 6.0 
BSPy01-12 6.0 
BSPy01-13 6.1" 
Data <- read.table(text=zz, header = TRUE) 

impute <- function(x, fun) { 
missing <- is.na(x) 
replace(x, missing, fun(x[!missing])) 
} 
ddply(Data, ~ group, transform, traits = impute(traits, median)) 
1

これはおそらくそれを行うための最もelegent方法ではありませんが、それは動作します:

title <- c("Mr", "Mrs", "Miss", "Mrs", "Mr", "Mr", "Mr", "Master", "Mrs") 
age <- c(22, 38, 26, 35, 35, NA, 54, 2, 27) 
df = data.frame(title, age) 

# get the medians by groups 
medians = aggregate(df$age, list(df$title), median, na.rm = TRUE) 
# match the missing ages with the medians thanks to the groups 
df$age[is.na(df$age)] <- medians[array(medians$Group.1) == df$title[is.na(df$age)], "x"] 
1

library(data.table)

dt <- data.table(title = c("Mr", "Mrs", "Miss", "Mrs", "Mr", "Mr", "Mr", "Master", "Mrs"), 
age = c(22, 38, 26, 35, 35, NA, 54, 2, 27)) 

dt[,avg_age:=median(age,na.rm=T),by="title"] 
dt[is.na(age),age:=avg_age] 
dt[,avg_age:=NULL] 
関連する問題