【问题标题】:Imputing Missing Values in R from reference data frame从参考数据框中输入 R 中的缺失值
【发布时间】:2015-08-05 22:17:23
【问题描述】:

我有一个暗 17000 x 3 的步行数据的数据框“dat”。间隔列是每 24 小时周期的 5 分钟间隔,日期列是日期,步数列是在所述日期的所述 5 分钟周期内采取的步数。存在 NA。

> head(df1)
  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

我使用 dplyr 将我的 df 按日期分组,然后创建了一个新的 df 'df.1' 并将其总结为 avg=mean(df.1$steps, na.rm =真的)。这给了我每个日期步数平均值的一个不错的小 df

         date      avg
1  2012-10-01      NaN
2  2012-10-02  0.43750
3  2012-10-03 39.41667
4  2012-10-04 42.06944
5  2012-10-05 46.15972
6  2012-10-06 53.54167

我想做的是用每个日期的平均值更新我原来的 df 的 NA 值。

因此,在 2012-10-02 为 NA 的第一个表中,我想将 2012-10-02 表一中的任何 NA 值替换为值 0.43750。我试过使用索引,%in%,适用于家庭,但找不到任何坚持的东西。

任何帮助将不胜感激。

【问题讨论】:

  • 你试过merge。此外,如果您使用过dplyr,则可以选择mutate 将列添加到原始数据集中,而不是summarise
  • 所以也许使用行名或索引值并合并类似的索引值?
  • 可能是library(dplyr); df1 %>% group_by(date) %>% mutate(avg= mean(steps, na.rm=TRUE))
  • 我已经有了那个位(计算的平均值)。然后我需要用给定日期的平均值更新原始 df 中的每个 NA 值。
  • 我的意思是您不需要创建第二个数据集,而是可以通过mutate 一步完成。如果需要,则merge(df1, df1.1, by='date', all=TRUE),然后按新列逐步更改NA值

标签: r missing-data


【解决方案1】:

这有点笨拙,但确实有效:

library(dplyr)
df1.1 <- df1 %>%
    group_by(date) %>%
    summarise(avg = mean(steps, na.rm = TRUE)) %>%
    merge(df1, ., all.x=TRUE) %>%
    mutate(steps = ifelse(is.na(steps)==TRUE, avg, steps)) %>%
    select(-avg)

这是我的玩具数据:

df1 <- data.frame(date = c(rep("2015-01-01", 12), rep("2015-01-02", 12)), interval = rep(seq(12), 2),
    steps = c(5, 7, NA, 12, 3, NA, 0, 4, 12, 10, 4, 0, 3, NA, 2, 1, NA, 15, 0, 4, 7, 2, NA, 2),
    stringsAsFactors = FALSE)

看起来像:

> head(df1)
        date interval steps
1 2015-01-01        1     5
2 2015-01-01        2     7
3 2015-01-01        3    NA
4 2015-01-01        4    12
5 2015-01-01        5     3
6 2015-01-01        6    NA 

这是结果的头部,df1.1:

> head(df1.1)
        date interval steps
1 2015-01-01        1   5.0
2 2015-01-01        2   7.0
3 2015-01-01        3   5.7
4 2015-01-01        4  12.0
5 2015-01-01        5   3.0
6 2015-01-01        6   5.7

下面是一组表示这些 5.7 来自哪里的表格:

> df1 %>% group_by(date) %>% summarise(avg = mean(steps, na.rm = TRUE))
Source: local data frame [2 x 2]

        date avg
1 2015-01-01 5.7
2 2015-01-02 4.0

【讨论】:

  • 我在尝试你的方法时得到 'NaN'。
  • 嗯。它的工作原理如我为模仿您描述的结构而制作的玩具数据所示。如果你一步一步做会发生什么?它似乎在管道的哪个步骤失败了?
  • 一次一步完成时效果非常好。我认为管道可能也有效,但我只是关注数据的不正确子集。嘘,我要学的东西太多了。你的实现并不太复杂,但我很生气,因为我不能像你那样清楚地看到它。
【解决方案2】:

如果 df1 是您的原始数据框,而 df.1 是包含按日期计算的平均值的数据框,我认为一个简单的 for 循环可以解决它:

for(i in df.1$date){
  df1[df1$date==i,"steps"]=df.1[df.1$date==i,"avg"]
}

它适用于我刚刚创建的玩具示例,希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多