如何用组均值取代NA?

时间:2019-07-17 12:18:57

标签: r na

我有两个数据帧,一个包含原始数据(和许多NA),一个包含不同间隔的原始数据的平均值。

我想用这些间隔替换NA,同时保留非NA。

我在“估算缺失数据r”或“替换缺失数据r”上进行了很多搜索,但是还没有找到任何合适的解决方案,它们要么都用0:s替换了数据,要么使用了一种用于此分配的复杂方法的方法,例如使用MICE软件包。

代码示例: 这是具有原始数据的第一个DF的头。如您所见,第一天它们都不适用。

   steps       date interval
1    NA 2012-10-01        0
2    NA 2012-10-01        5
3    NA 2012-10-01       10
4    NA 2012-10-01       15
5    NA 2012-10-01       20
6    NA 2012-10-01       25
...

第二个数据帧头包含每个间隔的平均步长,如下所示:

  steps interval
1 1.72          0
2 0.340         5
3 0.132        10
4 0.151        15
5 0.0755       20
6 2.09         25
...

现在,我正在寻找的是能够用相关间隔的平均步长填充NA,所以看起来像这样:

   steps       date interval
1  1.72  2012-10-01        0
2 0.340  2012-10-01        5
3 0.132  2012-10-01       10
4 0.151  2012-10-01       15
5 0.0755 2012-10-01       20
6 2.09   2012-10-01       25
...

有没有提示或缺少的资源链接?由于这是一项课程任务,而且我主要想学习,因此不帮我做任何帮助将不胜感激! =)

编辑:另外,由于这是我关于Stack Overflow的第一个问题,因此,对于如何改进我的问题解答的任何评论也将受到赞赏!

2 个答案:

答案 0 :(得分:0)

R中有很多方法可以做到这一点。例如

# generate dataframe with some interval vaulues
df1 <- data.frame(interval= rep(seq(0, 25, 5), 5))
# add a steps column
df1$steps <- 1:nrow(df)
# copy the dataframe
df2 <- df1
# replace some steps values with missings in df1
df1$steps[c(1,2,5, 14)] <- NA

# sapply goes thru every unique interval...
sapply(df1$interval, function(interval_i){
  # replace missing steps of interval_i in df1 with the steps mean of interval_i of df2
  df1$steps[is.na(df1$steps) & df1$interval == interval_i] <<- mean(df2$steps[df2$interval == interval_i], na.rm= TRUE)
# you must use <<- not <- to assign it to df outside of sapply
})

答案 1 :(得分:0)

我将使用dplyr添加一个解决方案。

优良作法是在您的问题中提供一些可重现的数据,而不是直接粘贴到数据的开头,而可以将这些数据直接放入R中。我创建了一些虚拟数据:

# create random sample data
library(dplyr)

set.seed(100)

df1 <- tibble(
  steps = runif(1e3),
  date = lubridate::today() + runif(1e3) * 24,
  interval = as.numeric(sample(seq(0,25, by=5), 1e3, replace = T))
)

# add 100 NAs at random
df1$steps[sample(1:1e3, 100)] <- NA

df1

#      steps  date       interval
#      <dbl>  <date>        <dbl>
# 1   0.308   2019-07-18      15
# 2   NA      2019-07-19      10
# 3   NA      2019-07-31       0
# 4   0.0564  2019-08-02      20
# 5   0.469   2019-07-25       0
# 6   0.484   2019-07-21      25
# 7   NA      2019-07-17       5
# 8   0.370   2019-07-28       0
# 9   0.547   2019-07-31       5
# 10  0.170   2019-08-08      15
# # … with 990 more rows

使用dplyr,插补任务就非常简单了

group_by

我们可以通过计算每个组的平均值并将其与估算值进行比较,来确定每个组的估算均值是正确的:

df1 %>%
  group_by(interval) %>%
  mutate(steps = if_else(is.na(steps), mean(steps, na.rm = T), steps))

# # A tibble: 1,000 x 3
# # Groups:   interval [6]
#     steps  date       interval
#     <dbl>  <date>        <dbl>
# 1   0.308  2019-07-18       15
# 2   0.573  2019-07-19       10
# 3   0.523  2019-07-31        0
# 4   0.0564 2019-08-02       20
# 5   0.469  2019-07-25        0
# 6   0.484  2019-07-21       25
# 7   0.527  2019-07-17        5
# 8   0.370  2019-07-28        0
# 9   0.547  2019-07-31        5
# 10  0.170  2019-08-08       15
# # … with 990 more rows