【问题标题】:Replace NAs in R替换 R 中的 NA
【发布时间】:2021-07-02 17:13:09
【问题描述】:

我有一个巨大的数据框,我想减少其中的 NA。 日期看起来如何的一个简短示例是这样的

year company value
2007 pepsi NA
2008 pepsi NA
2009 pepsi 0,5
2010 pepsi 2
2005 sprite NA
2007 sprite NA
2008 sprite NA

每当一家公司有分数时,我都想用最小值替换 NA。但是,当这家公司的任何列中没有值时,我想保留 NA。所以日期看起来像这样:

year company value
2007 pepsi 0,5
2008 pepsi 0,5
2009 pepsi 0,5
2010 pepsi 2
2005 sprite NA
2007 sprite NA
2008 sprite NA

这是我尝试过的代码:

df<- df %>% group_by(company) %>% mutate(value= ifelse(is.na(value), min(value, na.rm = T), value))

但是,当我在我的数据上运行它时,我得到了无限的值。我想这是因为当一家公司完全没有价值时,我不知道如何告诉 r 该怎么做。

我还尝试了一些细微的变化,例如:

df<- df %>% group_by(company) %>% mutate(value= ifelse(is.na(value), min(value, na.rm = T), "O"))
df<- df %>% group_by(company) %>% mutate(value= ifelse(is.na(value), min(value, na.rm = T), "NA"))

这些也没有用。

这里有一些可重复的数据。我希望我以正确的格式提供了它(如果有误,请告诉我,我会纠正它!):

df <- data.frame(
  year = c('2007','2008','2009','2010','2005','2007','2008'),
  company= c('pepsi','pepsi','pepsi','pepsi','sprite','sprite','sprite'),
  value= c(NA,NA,0.5,2,NA,NA,NA)

【问题讨论】:

    标签: r


    【解决方案1】:

    按“公司”分组后,创建一个ifelse 条件,检查all 元素是否为NA,然后返回NA,否则应用na.aggregate 替换NA 元素与min(在FUN 中指定)

    library(zoo)
    library(dplyr)
    df %>%      
       group_by(company) %>%
       mutate(value = if(all(is.na(value))) NA_real_ 
           else na.aggregate(value, FUN = "min"))
    

    或者另一个选项是replace + if/else

    df %>%      
        group_by(company) %>%
        mutate(value = if(all(is.na(value))) NA_real_ else 
            replace(value, is.na(value), min(value, na.rm = TRUE))) %>%
        ungroup
    

    -输出

    # A tibble: 7 x 3
      year  company value
      <chr> <chr>   <dbl>
    1 2007  pepsi     0.5
    2 2008  pepsi     0.5
    3 2009  pepsi     0.5
    4 2010  pepsi     2  
    5 2005  sprite   NA  
    6 2007  sprite   NA  
    7 2008  sprite   NA  
    

    我们可以避免if/elsemin_ 来自hablar

    library(hablar)
    df %>%
       group_by(company) %>%
       mutate(value = replace(value, is.na(value), min_(value)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-13
      • 2019-10-11
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多