我有两个数据帧,一个包含原始数据(和许多NA),一个包含不同间隔的原始数据的平均值。
我想用这些间隔替换NA,同时保留非NA。
我在“估算缺失数据r”或“替换缺失数据r”上进行了很多搜索,但是还没有找到任何合适的解决方案,它们要么都用0:s替换了数据,要么使用了一种用于此分配的复杂方法的方法,例如使用MICE软件包。
代码示例: 这是具有原始数据的第一个DF的头。如您所见,第一天它们都不适用。
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的第一个问题,因此,对于如何改进我的问题解答的任何评论也将受到赞赏!
答案 0 :(得分:0)
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
})
答案 1 :(得分:0)
我将使用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