从参考数据框输入R中的缺失值
我有一个17000 x 3的行走数据的数据框'dat'。间隔列为每24小时间隔5分钟,日期列为日期,步骤列为所述5分钟内在所述日期采取的步骤数。NA的存在从参考数据框输入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
> 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"]
}