我是R的新手,正在其中探索各种美丽的选择。我正在处理一个数据框,其中有一个变量,该变量具有900个缺失值,即NA
。
我想为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。通常我们选择我的模式,但是我想尝试这种方法。
答案 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)