用缺少的数据填充行

时间:2018-07-30 20:26:57

标签: r missing-data

我有一个特定的代码要在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”没有一行,我希望两者的值分别为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"))

2 个答案:

答案 0 :(得分:2)

这应该可以,但是未经测试,因为您的数据没有以复制/粘贴的方式共享。分享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

答案 1 :(得分:1)

这是一个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