簡體   English   中英

R:用中間值計算 NA,對第一個和最后一個 NA 求和

[英]R: Computate NA with mean between, summing first and last NAs

考慮一個數據集:

df1 <- tibble::tribble(~Place,  ~Year,  ~Cake,  ~Coffee,    ~Tea,
"Local Cafe 1", 2022,   50, 100,    30,
"Local Cafe 1", 2021,   50, NA, 30,
"Local Cafe 1", 2020,   50, 80, NA,
"Local Cafe 1", 2019,   50, 70, 20,
"Local Cafe 1", 2018,   NA, 60, 20,
"Local Cafe 2", 2022,   60, NA, 40,
"Local Cafe 2", 2021,   NA, 50, NA,
"Local Cafe 2", 2020,   40, 40, NA,
"Local Cafe 2", 2019,   30, 30, NA,
"Local Cafe 3", 2022,   30, 40, NA,
"Local Cafe 3", 2021,   NA, NA, NA)

這是用於視覺表示的相同數據集:

在此處輸入圖像描述

所需的操作:

  1. 如果總和介於兩者之間,則表示均值(示例:序列 30、NA、40 => NA<- 35 (30+40)/2
  2. 如果差距大於一,則增長相等(例如:序列 30, NA, NA, 60 => 30, 40, 50, 60。
  3. 如果 NA 是第一個(例如 2021 值為 100,而 2022 - NA),則序列可用(例如 10, 20, 30, NA => 10, 20, 30, 40;或者,如果沒有序列數據, 然后最終值可用 (例如: 30, NA => 30, 30)
  • 如果 NA 在最后 - 那么相同的邏輯:(NA, 10, 20, 30 => 0, 10, 20, 30; 或者如果 NA, 20 => 20, 20

所需的 output:

在此處輸入圖像描述

橙色單元格 - 是填充值。 我將感謝任何關於一個好的解決方案的建議:)

我們可以按 'Place' 分組,在 'Cake' 到 'Tea' 列上應用na.approx (來自zoo ),並在末尾用之前的非 NA 值fill NA

library(dplyr)
library(tidyr)
library(zoo)
df1 %>%
   group_by(Place) %>% 
   mutate(across(Cake:Tea, ~  na.approx(.x, na.rm = FALSE))) %>% 
   fill(Cake:Tea, .direction = "downup") %>% 
   ungroup

-輸出

# A tibble: 11 × 5
   Place         Year  Cake Coffee   Tea
   <chr>        <dbl> <dbl>  <dbl> <dbl>
 1 Local Cafe 1  2022    50    100    30
 2 Local Cafe 1  2021    50     90    30
 3 Local Cafe 1  2020    50     80    25
 4 Local Cafe 1  2019    50     70    20
 5 Local Cafe 1  2018    50     60    20
 6 Local Cafe 2  2022    60     50    40
 7 Local Cafe 2  2021    50     50    40
 8 Local Cafe 2  2020    40     40    40
 9 Local Cafe 2  2019    30     30    40
10 Local Cafe 3  2022    30     40    NA
11 Local Cafe 3  2021    30     40    NA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM