Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从参考数据框输入R中的缺失值_R_Missing Data - Fatal编程技术网

从参考数据框输入R中的缺失值

从参考数据框输入R中的缺失值,r,missing-data,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-0

我有一个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=TRUE)。这给了我一个很好的关于每个日期步骤平均值的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,那么我想用0.43750的值替换表1中2012-10-02的NA值。我尝试过使用索引,它以%为单位应用于family,但找不到任何粘滞的东西


任何帮助都将不胜感激。

这有点笨重,但它可以:

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.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

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

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

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

您是否尝试过
merge
。此外,如果您使用了
dplyr
mutate
将是一个选项,可以将列添加到原始数据集中,而不是
summary
,因此可以使用行名或索引值并合并到类似的索引值上?可能是
库(dplyr);df1%>%group_by(date)%>%mutate(平均值=平均值(步长,na.rm=真))
我已经有了那个位(计算出的平均值)。我需要的是用给定日期的平均值更新原始df中的每个NA值。我的意思是,您不需要创建第二个数据集,而是可以通过
mutate
一步完成。如果需要,则
合并(df1,df1.1,by='date',all=TRUE)
然后按新列逐步更改NA值我尝试您的方法时得到'NaN'。它的工作原理如我制作的玩具数据所示,以模拟您描述的结构。如果你一步一步地做会发生什么?在管道的哪一步似乎失败了?当一步一步地进行时,它工作得非常好。我认为这些管道可能也起了作用,但我只是关注数据的一个不正确的子集。嘘,我有很多东西要学。您的实现并不太复杂,但我很恼火,因为我不能像您那样清楚地看到它。
> 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
for(i in df.1$date){
  df1[df1$date==i,"steps"]=df.1[df.1$date==i,"avg"]
}