首页 > 解决方案 > 如何根据R中的日期填写缺失值?

问题描述

我有一个以下格式的数据框,代表我拥有的大型数据集

F.names<-c('M','M','M','A','A')
L.names<-c('Ab','Ab','Ab','Ac','Ac')
year<-c('August 2015','September 2014','September 2016', 'August 2014','September 2013')
grade<-c(NA,'9th Grade','11th Grade',NA,'11th grade')

df.have<-data.frame(F.names,L.names,year,grade)

F.names L.names           year      grade
1       M      Ab    August 2015       <NA>
2       M      Ab September 2014  9th Grade
3       M      Ab September 2016 11th Grade
4       A      Ac    August 2014       <NA>
5       A      Ac September 2013 11th grade

year列是factor原始数据集中的格式,并且有几个缺失值。grade基本上我想grade根据year列填写缺失值,使其如下所示。

F.names L.names           year      grade
1       M      Ab    August 2015 10th Grade
2       M      Ab September 2014  9th Grade
3       M      Ab September 2016 11th Grade
4       A      Ac    August 2014 12th Grade
5       A      Ac September 2013 11th grade

我在想我的第一步是将格式的yearfactor转换为日期格式。然后按顺序排列列,并使用fillfrom之类的东西tidyr来填充缺失的列。我应该怎么做呢,还是有更好的方法来解决这个问题?

标签: rtidyr

解决方案


F.names<-c('M','M','M','A','A')
L.names<-c('Ab','Ab','Ab','Ac','Ac')
year<-c('August 2015','September 2014','September 2016', 'August 2014','September 2013')
grade<-c(NA,'9th Grade','11th Grade',NA,'11th grade')

df.have<-data.frame(F.names,L.names,year,grade)

library(tidyverse)

df.have %>%
  separate(year, c("m","y"), convert = T, remove = F) %>%
  separate(grade, c("num","type"), sep="th", convert = T) %>%
  arrange(F.names, y) %>%
  group_by(F.names) %>%
  mutate(num = ifelse(is.na(num), lag(num) + 1, num),
         type = "grade") %>%
  ungroup() %>%
  unite(grade, num, type, sep="th ") %>%
  select(-m, -y)

#   F.names L.names           year      grade
# 1       A      Ac September 2013 11th grade
# 2       A      Ac    August 2014 12th grade
# 3       M      Ab September 2014  9th grade
# 4       M      Ab    August 2015 10th grade
# 5       M      Ab September 2016 11th grade

此解决方案假定NA给定F.names值不会有 2 个或更多连续 s。


推荐阅读