仅估算数据帧中变量的某些NA

时间:2019-02-04 20:29:07

标签: r

我是R的新手,正在其中探索各种美丽的选择。我正在处理一个数据框,其中有一个变量,该变量具有900个缺失值,即NA。 我想为NA估算3个不同的值;

  • 第1个300 NA,值为1。
  • 第2个300 NA,值为2。
  • 第3个300 NA,值为3。

数据中共有23272行。

dim(data)
[1] 23272    2

colSums(is.na(data))
month    year
884      884

summary(data$month)
1    2    3    4    5    6    7    8    9    10    11    12    NA's
1977 1658 1837 1584 1703 1920 1789 2046 1955 2026  1845  2048  884

如果我们检查第8,10和12月,则没有太大差异,因此,考虑通过按比例(300:300:284)进行划分,将这3个月分配给NA。通常我们选择我的模式,但是我想尝试这种方法。

2 个答案:

答案 0 :(得分:1)

我假设您的意思是列表很长,其中一些值为NA:

set.seed(42)
df <- data.frame(val = sample(c(1:3, NA_real_), size = 1000, replace = TRUE))

我们可以保持NA的连续计数,并使用%/%的整数除法将其分配给估算值。

library(tidyverse)
df2 <- df %>%
  mutate(NA_num = if_else(is.na(val),
                          cumsum(is.na(val)),
                          NA_integer_),
         imputed = NA_num %/% 100 + 1)

输出:

df2 %>%
  slice(397:410)  # based on manual examination using this seed

   val NA_num imputed
1   NA     98       1
2   NA     99       1
3    3     NA      NA
4    1     NA      NA
5    1     NA      NA
6    3     NA      NA
7    3     NA      NA
8    2     NA      NA
9   NA    100       2
10   1     NA      NA
11  NA    101       2
12   2     NA      NA
13   1     NA      NA
14   2     NA      NA

答案 1 :(得分:0)

没有一个例子,我认为这会起作用。

基本上,将NA过滤到新表中,进行计算并将其合并回去。假设new_dt是OG数据,您可以在其中过滤以仅包含NAs

library('tidyverse');
new_dt = data.frame(x1 =rep(1:900), x2= NA) %>%  filter(is.na(x2)) %>%
mutate(23 = case_when(row_number()%/%300==0 ~1,
                      row_number()%/%300==1 ~2,
                      row_number()%/%300==2 ~3))
dt <- rbind(dt,new_dt)