【问题标题】:Ignoring NA in calculation while doing calculation on data frame columns在对数据框列进行计算时忽略计算中的 NA
【发布时间】:2020-11-23 22:10:09
【问题描述】:

我有一个如下所示形式的数据框:

structure(list(First = c("3.2", "3.2", "3.2", NA, "3.3", NA, 
NA), `cut-off` = c("100000", "100000", "100000", NA, "100000", 
NA, NA), Second = c("1.1", "1.2", "1.2", NA, "1.2", "1.6", NA
), Bonus = c(NA_character_, NA_character_, NA_character_, NA_character_, 
NA_character_, NA_character_, NA_character_), Fixed = c(NA, NA, 
NA, "4000", NA, NA, NA)), row.names = c(NA, -7L), class = c("tbl_df", 
"tbl", "data.frame"))

# A tibble: 6 x 5
  First `cut-off` Second Bonus Fixed
  <chr> <chr>     <chr>  <chr> <chr>
1 3.2   100000    1.1    NA    NA   
2 3.2   100000    1.2    NA    NA   
3 3.2   100000    1.2    NA    NA   
4 NA    NA        NA     NA    4000 
5 3.3   100000    1.2    NA    NA   
6 NA    NA        1.6    NA    NA 
7 NA    NA        NA     NA    NA

我要做的是计算一个名为 Total 的新列,该列将根据以下公式计算:

Total=(First*cut-off/100)+(second*300000/100)+Bonus+Fixed

我遇到的问题是,根据情况,每行中的几个单元格将是 NA 但我想忽略 NA 并在数学计算中将其视为 0(但我不能将它替换为 0 至于某些当一行中的所有单元格都是 NA 时,我想在 Total 列中显示 NA)。因此,上述数据帧的加速结果将是:

  First `cut-off` Second Bonus Fixed   Total
  <chr> <chr>     <chr>  <chr> <chr>
1 3.2   100000    1.1    NA    NA       6500
2 3.2   100000    1.2    NA    NA       6800
3 3.2   100000    1.2    NA    NA       6800 
4 NA    NA        NA     NA    4000     4000
5 3.3   100000    1.2    NA    NA       6900
6 NA    NA        1.6    NA    NA       4800
7 NA    NA        NA     NA    NA       NA

我该怎么做?

【问题讨论】:

    标签: r dataframe na


    【解决方案1】:

    我们可以在转换type之后使用rowSums,因为有些列类型是character

    library(dplyr)
    df1 %>%
       type.convert(as.is = TRUE) %>%        
       mutate(Bonus = as.numeric(Bonus), 
       Total=rowSums(cbind(First*`cut-off`/100, 
             (Second*300000/100), Bonus, Fixed), na.rm = TRUE))
    

    -输出

    # A tibble: 7 x 6
    #  First `cut-off` Second Bonus Fixed Total
    #  <dbl>     <int>  <dbl> <dbl> <int> <dbl>
    #1   3.2    100000    1.1    NA    NA  6500
    #2   3.2    100000    1.2    NA    NA  6800
    #3   3.2    100000    1.2    NA    NA  6800
    #4  NA          NA   NA      NA  4000  4000
    #5   3.3    100000    1.2    NA    NA  6900
    #6  NA          NA    1.6    NA    NA  4800
    #7  NA          NA   NA      NA    NA     0
    

    【讨论】:

    • 谢谢阿克伦。我收到错误消息,虽然说Error: Problem with mutate() input Total. x object 'second' not found i Input Total is rowSums(...). 此外,Bonus 列不仅是一个字符列,而且还有其他列。你有什么理由只转换bounu 列吗?你能解释一下为什么我们有type.convert吗?
    • @Roozbeh_you 你有Second 作为列名而不是second 更正
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 2017-08-28
    • 1970-01-01
    • 2018-02-01
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多