繁体   English   中英

将 NA 替换为最小组值 R

[英]Replace NA with minimum Group Value R

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

名称 开始
2010 爱玛 1998
2011年 爱玛 1998
2012 爱玛 1998
2009 约翰
2010 约翰
2012 约翰
2007年 路易斯
2012 路易斯

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

名称 开始
2010 爱玛 1998
2011年 爱玛 1998
2012 爱玛 1998
2009 约翰 2009
2010 约翰 2009
2012 约翰 2009
2007年 路易斯 2007年
2012 路易斯 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 function 或使用 data.table 这两个似乎都不符合我的问题

我的基地 function 一定是这样的

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

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

感谢您的任何帮助

我将 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 

我们可以使用na.aggregate

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

tidyverse 中有一个replace_na() tidyverse可以在mutate()中使用。

这将用year的最小值替换start列中的NA

library(tidyverse)

mydf %>% 
  group_by(name) %>% 
  mutate(start = replace_na(start, min(year)))
# A tibble: 8 x 3
# Groups:   name [3]
   year name  start
  <dbl> <chr> <dbl>
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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM