所以,我有一个看起来像这样的数据集:
site year territories cat
1 10 2017 0.0 1
2 10 2016 NA NA
3 10 2015 2.0 1
4 10 2014 NA NA
5 10 2013 NA NA
6 11 2012 NA NA
7 11 2011 0.0 2
8 11 2010 NA NA
9 11 2009 1.0 2
但我不希望在cat
列中有NA。相反,我希望同一网站中的每一行都获得相同的cat
值。
就像这样:
site year territories cat
1 10 2017 0.0 1
2 10 2016 NA 1
3 10 2015 2.0 1
4 10 2014 NA 1
5 10 2013 NA 1
6 11 2012 NA 2
7 11 2011 0.0 2
8 11 2010 NA 2
9 11 2009 1.0 2
关于我如何做到这一点的任何想法?
答案 0 :(得分:1)
使用na.aggregate
使用ave
填写NA值,以site
完成。
library(zoo)
transform(DF, cat = ave(cat, site, FUN = na.aggregate))
,并提供:
site year territories cat
1 10 2017 0 1
2 10 2016 NA 1
3 10 2015 2 1
4 10 2014 NA 1
5 10 2013 NA 1
6 11 2012 NA 2
7 11 2011 0 2
8 11 2010 NA 2
9 11 2009 1 2
以可重复的形式使用的输入是:
Lines <- "
site year territories cat
1 10 2017 0.0 1
2 10 2016 NA NA
3 10 2015 2.0 1
4 10 2014 NA NA
5 10 2013 NA NA
6 11 2012 NA NA
7 11 2011 0.0 2
8 11 2010 NA NA
9 11 2009 1.0 2"
DF <- read.table(text = Lines)
答案 1 :(得分:1)
完整的基础R替代方案:
transform(DF, cat = ave(cat, site, FUN = function(x) x[!is.na(x)][1]))
给出:
site year territories cat 1 10 2017 0 1 2 10 2016 NA 1 3 10 2015 2 1 4 10 2014 NA 1 5 10 2013 NA 1 6 11 2012 NA 2 7 11 2011 0 2 8 11 2010 NA 2 9 11 2009 1 2
与dplyr
实施的逻辑相同:
library(dplyr)
DF %>%
group_by(site) %>%
mutate(cat = na.omit(cat)[1])
或使用na.locf
的{{1}} - 包:
zoo
或library(zoo)
transform(DF, cat = ave(cat, site, FUN = function(x) na.locf(na.locf(x, fromLast = TRUE, na.rm = FALSE))))
来自fill
:
tidyr
注意:我想知道library(tidyr)
library(dplyr)
DF %>%
group_by(site) %>%
fill(cat) %>%
fill(cat, .direction = "up")
列的附加价值是什么,cat
列必须与每个cat
相同。你最终会得到两个完全相同的分组变量,从而使它们成为多余的imo。
答案 2 :(得分:0)
您也可以使用Long
tidyr::fill