【问题标题】:Replace NA with minimum Group Value R用最小组值 R 替换 NA
【发布时间】:2021-05-22 14:28:30
【问题描述】:

我正在努力转换我的数据,希望能得到一些帮助

year name start
2010 Emma 1998
2011 Emma 1998
2012 Emma 1998
2009 John na
2010 John na
2012 John na
2007 Louis na
2012 Louis na

目的是用每个名称组的最小值替换所有 NA,使数据看起来像这样

year name start
2010 Emma 1998
2011 Emma 1998
2012 Emma 1998
2009 John 2009
2010 John 2009
2012 John 2009
2007 Louis 2007
2012 Louis 2007

注意:一个名称组的所有起始值要么是 NA,要么没有

我尝试使用

mydf %>%   group_by(name) %>%   mutate(start= ifelse(is.na(start), min(year, na.rm = T), start))

但出现此错误

x `start` must return compatible vectors across groups

这里有很多类似的问题。 这里有些人使用 ave 函数或使用 data.table 似乎都不适合我的问题

我的基本功能一定是这样的

df$A <- ifelse(is.na(df$A), df$B, df$A)

但是我似乎无法将它与 min() 和 group by() 函数正确结合。

感谢您的帮助

【问题讨论】:

  • mydf %&gt;% group_by(name) %&gt;% mutate(start= ifelse(is.na(start), min(year, na.rm = T), start)) 为我工作。请使用dput 以可重复的格式提供数据。阅读how to give a reproducible example

标签: r


【解决方案1】:

我将 colname 更改为“Year”,因为它正在发生冲突

dat %>% 
    dplyr::group_by(name) %>% 
    dplyr::mutate(start = dplyr::if_else(start == "na", min(Year), start))
# A tibble: 8 x 3
# Groups:   name [3]
  Year  name  start
  <chr> <chr> <chr>
1 2010  Emma  1998 
2 2011  Emma  1998 
3 2012  Emma  1998 
4 2009  John  2009 
5 2010  John  2009 
6 2012  John  2009 
7 2007  Louis 2007 
8 2012  Louis 2007 

【讨论】:

    【解决方案2】:

    我们可以使用na.aggregate

    library(dplyr)
    library(zoo)
    dat %>%
       group_by(name) %>%
       mutate(start = na.aggregate(na_if(start, "na"), FUN = min))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-22
      • 2014-06-28
      • 2011-12-05
      相关资源
      最近更新 更多