【问题标题】:How to replace NAs by group mean?如何按组均值替换 NA?
【发布时间】:2019-11-26 06:40:17
【问题描述】:

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

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

我在“估算丢失的数据 r”或“替换丢失的数据 r”上搜索了很多,但还没有找到任何似乎适合的解决方案,它们似乎都用 0:s 替换数据,或者使用这种分配的复杂方法的一种方法,例如使用 MICE 包。

代码示例: 这是第一个 DF 的头部,带有原始数据。如您所见,第一天他们都是NA。

   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 上的第一个问题,任何关于如何改进我的问题制作的 cmet 也很感激!

【问题讨论】:

  • 欢迎来到 SO,这可能是一个涉及 plyr 包的rbind.fill() 或类似 full_join(df1,df2,by="interval")%>%mutate(.,steps=coalesce(steps.x,steps.y) 的解决方案,使用 dplyr 或简单地使用来自 base R 的 merge if "步骤”在 df1 中始终为 NA。为了改进您的问题,请使用dput(df1) 提供可重现的数据框,并说明您的尝试。

标签: r na missing-data imputation


【解决方案1】:

在 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
})

【讨论】:

  • 非常感谢,这似乎确实可以解决问题!我现在需要一些时间来尝试完全理解所有内容 =)
  • @LeoCarlsson 很高兴它对您有所帮助 :-) 使用 for 循环将是 for(interval_i in unique(df1$interval)){ df1$steps[is.na(df1$steps) &amp; df1$interval == interval_i] &lt;- mean(df2$steps[df2$interval == interval_i], na.rm= TRUE) }
【解决方案2】:

我将使用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

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

df1 %>%
 group_by(interval) %>% 
 summarise(mean_int = mean(steps, na.rm=T))


# # A tibble: 6 x 2
#     interval mean_int
#     <dbl>    <dbl>
# 1        0    0.523
# 2        5    0.527
# 3       10    0.573
# 4       15    0.511
# 5       20    0.475
# 6       25    0.485

【讨论】:

  • 非常感谢!会带着这个! :)
猜你喜欢
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2016-10-03
相关资源
最近更新 更多