我有一个特定的代码要在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"))
答案 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