根据另一列的值分配给一列的非循环方式

时间:2019-07-10 12:27:29

标签: r data-manipulation data-cleaning

我想根据不同数据框中另一列的值填写一列的缺失值。

我正在用R进行一些清洗,并且正在使用来自这个Kaggle数据集https://www.kaggle.com/heesoo37/120-years-of-olympic-history-athletes-and-results的“ athlete_events.csv”文件

我想做的是用每个运动员参加的运动的平均年龄来代替每个运动员的“年龄”列中的缺失值。

我还是一个初学者,所以可能会有一些多余的代码。

但是首先我读入文件:

mean_sport_age = olympic_tbl %>% group_by(Sport) %>% summarize(mean(Age, na.rm=TRUE))
mean_sport_age = as.data.frame(mean_sport_age)
row.names(mean_sport_age) = mean_sport_age$Sport
colnames(mean_sport_age) = c("Sport","Age")

然后,我创建一个名为“ mean_sport_age”的新数据框,其中包含两列-运动和该运动中竞争对手的平均年龄。我将行标签更改为Sport,将列名称更改为便于索引。

for (i in 1:500) {
  if (is.na(olympic_tbl[i,]$Age)){
    sport = olympic_tbl[i,]$Sport
    olympic_tbl[i,]$Age = mean_sport_age[sport,"Age"]
  }
}

然后,我遍历原始数据数据帧的每一行,检查“年龄”值是否缺失,如果缺失,则查询运动员的运动,然后使用该值查找该运动的平均年龄,以替换年龄列中的缺失值:

doPost()

我得到了想要的预期结果-但是,有没有一种更快的方法可以不遍历数据帧的每一行呢?

1 个答案:

答案 0 :(得分:0)

考虑到每个人的运动,您可以使用dplyr管道,例如:

olympic_tbl %>% group_by(Sport) %>% mutate(Age=ifelse(is.na(Age),mean(Age, na.rm=TRUE),Age))

如果值为na,则将通过组的平均值进行更新。否则,它将保持不变。