有时候处理Excel数据时会出现很多NA值,比如将多行数据合并的时候,导入R里面就会发现NA值,对于NA值的填充有很多办法,这里介绍自动填充为上一行的数值,使用的tidyverse包和zoo包分别演示,但我认为方便的是zoo包。
先构建一个数据
td <- data.frame("State" = c("NY", "","", "OH","", ""),
"Your" = c(101:106), "Name" = c(5:6,"",8:9,"")
)
State | Your | Name |
---|---|---|
NY | 101 | 5 |
NA | 102 | 6 |
NA | 103 | NA |
OH | 104 | 8 |
NA | 105 | 9 |
NA | 106 | NA |
首先是tidyverse包,演示填充State列的NA值为上一个数据
library(tidyverse)
td %>%
mutate(State = na_if(State, "")) %>%
fill(State)
State | Your | Name |
---|---|---|
NY | 101 | 5 |
NY | 102 | 6 |
NY | 103 | NA |
OH | 104 | 8 |
OH | 105 | 9 |
OH | 106 | NA |
可以发现,State列的NA值已经填充为上一行的数据,但是Name列还差点意思,这时候我们需要用到zoo包,首先我们要将""替换成NA,然后使用zoo一步替换为上一数据(这里要注意,如果不将''替换成NA,将会填充不完全)
我们分别演示一下,首先是不替换NA,直接运行函数
zoo::na.locf(td)
State | Your | Name |
---|---|---|
NY | 101 | 5 |
NA | 102 | 6 |
NA | 103 | NA |
OH | 104 | 8 |
NA | 105 | 9 |
NA | 106 | NA |
可以发现一点都没有替换,接下来将''替换成NA
td[td=='']=NA
zoo::na.locf(td)
State | Your | Name |
---|---|---|
NY | 101 | 5 |
NY | 102 | 6 |
NY | 103 | 6 |
OH | 104 | 8 |
OH | 105 | 9 |
OH | 106 | 9 |
完美解决所有列的NA值
网友评论