从参考数据框

时间:2015-08-05 22:17:24

标签: r missing-data

我有一个昏暗的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,适用于家庭,而且找不到任何坚持的东西。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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