【问题标题】:Filling in Rows with Missing Data用缺失数据填充行
【发布时间】:2018-07-30 20:26:57
【问题描述】:

我有一个特定的代码,我想用 R 编写,但在 Stack Overflow 上找不到答案。我正在处理一个大陆数据集,并希望计算每年的累积值。这是 df 的快照:

Continent   Year  Value     Cumulative Value
   <chr>      <dbl> <dbl>              <dbl>
 1 Europe     2000.   10.                10.
 2 Asia       2000.   30.                30.
 3 Africa     2000.   67.                67.
 4 N. America 2000.   23.                23.
 5 S. America 2000.   19.                19.
 6 Europe     2001.    3.                13.
 7 Asia       2001.    4.                34.
 8 Africa     2001.    3.                70.
 9 Europe     2002.    3.                16.
10 Asia       2002.    9.                43.
11 Africa     2002.    2.                72.
12 N. America 2002.    4.                27.
13 S. America 2002.   90.               109.

我的问题是,并非每个大陆每年都有价值,但我仍然需要那一年的累积价值。对于该特定大陆,该年的累计值将与上一年相同。

例如,在 2001 年,N. America 和 S. America 没有一行,我希望两者都显示 value = 0 和累积值分别为 23 和 19,与上一年相同(2000 年)。我不确定什么代码会完成这个,所以任何建议都将不胜感激。

Continent   Year  Value     Cumulative Value
N. America 2001.   0.                23.
S. America 2001.   0.                19.

如果我应该提供更多信息,请告诉我,再次感谢!

数据

structure(list(Continent = c("Europe", "Asia", "Africa", "N. America", 
"S. America", "Europe", "Asia", "Africa", "Europe", "Asia", "Africa", 
"N. America", "S. America"), Year = c(2000, 2000, 2000, 2000, 
2000, 2001, 2001, 2001, 2002, 2002, 2002, 2002, 2002), Value = c(10, 
30, 67, 23, 19, 3, 4, 3, 3, 9, 2, 4, 90), `Cumulative Value` = c(10, 
30, 67, 23, 19, 13, 34, 70, 16, 43, 72, 27, 109)), .Names = c("Continent", 
"Year", "Value", "Cumulative Value"), row.names = c(NA, -13L), class = c("tbl_df", 
"tbl", "data.frame"))

【问题讨论】:

  • tidyr::complete
  • 您能分享一下您的样本数据的dput() 吗?由于所有空格,您的格式很难导入。
  • 这里是样本的输出:structure(list(Continent = c("Europe", "Asia", "Africa", "N. America", "S. America", "Europe" , "Asia", "Africa", "Europe", "Asia", "Africa", "N. America", "S. America"), Year = c(2000, 2000, 2000, 2000, 2000, 2001, 2001, 2001, 2002, 2002, 2002, 2002, 2002), 值 = c(10, 30, 67, 23, 19, 3, 4, 3, 3, 9, 2, 4, 90), Cumulative Value = c(10, 30, 67, 23, 19, 13, 34, 70, 16, 43, 72, 27, 109)), .Names = c("大陆", "年份", "值", "累计值"), row.names = c(NA, -13L), class= c("tbl_df", "tbl", "data.frame"))
  • tidyr::complete 工作,这比我预期的要容易得多。 df %>% 完成(年,大陆,填充 = 列表(值 = 0))

标签: r missing-data


【解决方案1】:

这应该可行,但未经测试,因为您的数据不是以复制/可粘贴的方式共享的。分享dput(your_sample_data),我会测试/调试。

library(dplyr)
library(tidyr)
complete(your_data, Continent, Year, fill = list(Value = 0)) %>%
  group_by(Continent) %>%
  mutate(`Cumulative Value` = zoo::na.locf(`Cumulative Value`))
# A tibble: 15 x 4
# Groups:   Continent [5]
   Continent   Year Value    CV
   <chr>      <dbl> <dbl> <dbl>
 1 Africa      2000    67    67
 2 Africa      2001     3    70
 3 Africa      2002     2    72
 4 Asia        2000    30    30
 5 Asia        2001     4    34
 6 Asia        2002     9    43
 7 Europe      2000    10    10
 8 Europe      2001     3    13
 9 Europe      2002     3    16
10 N. America  2000    23    23
11 N. America  2001     0    23
12 N. America  2002     4    27
13 S. America  2000    19    19
14 S. America  2001     0    19
15 S. America  2002    90   109

【讨论】:

    【解决方案2】:

    这是一个tidyverse 选项:

    library(tidyverse)
    
    df %>% 
      complete(Continent, Year) %>% 
      replace_na(list(Value = 0)) %>% 
      fill(Cumulative) 
    
    # A tibble: 15 x 4
       Continent   Year Value Cumulative
       <chr>      <int> <dbl>      <int>
     1 Africa      2000    67         67
     2 Africa      2001     3         70
     3 Africa      2002     2         72
     4 Asia        2000    30         30
     5 Asia        2001     4         34
     6 Asia        2002     9         43
     7 Europe      2000    10         10
     8 Europe      2001     3         13
     9 Europe      2002     3         16
    10 N. America  2000    23         23
    11 N. America  2001     0         23
    12 N. America  2002     4         27
    13 S. America  2000    19         19
    14 S. America  2001     0         19
    15 S. America  2002    90        109
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-31
      • 2022-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      相关资源
      最近更新 更多