如何在我的数据框中将同一类别中的所有值都相等?

时间:2018-02-16 15:36:32

标签: r dataframe

所以,我有一个看起来像这样的数据集:

      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

关于我如何做到这一点的任何想法?

3 个答案:

答案 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