【问题标题】:R: create or delete rows given a range of values [duplicate]R:在给定值范围内创建或删除行[重复]
【发布时间】:2021-11-19 01:53:20
【问题描述】:
我有下一个包含国家、年份和 GDP 的数据库:
我有什么
| Country |
Year |
GDP |
| Afghanistan |
1950 |
$123 |
| Afghanistan |
1951 |
$123 |
| Afghanistan |
2019 |
$123 |
| Australia |
1945 |
$123 |
| Australia |
2021 |
$123 |
我需要创建或删除行,以便每个国家/地区都有从 1948 年到 2021 年的行。因此,例如,对于阿富汗,我需要创建 1948 年到 1949 年和 2021 年的行,GDP 为空,而对于澳大利亚,删除1945 行并在其间创造一切。
这不是我的确切数据库,我有 200 多个国家/地区,每个国家/地区都有不同的年份。有没有办法轻松创建?
我需要什么
| Country |
Year |
GDP |
| Afghanistan |
1948 |
NA |
| ... |
... |
... |
| Afghanistan |
2021 |
NA |
| Australia |
1948 |
$123 |
| ... |
... |
... |
| Australia |
2021 |
$123 |
【问题讨论】:
标签:
r
dataframe
panel-data
【解决方案1】:
我们可以使用complete 来创建缺失的组合并将GDP 指定为0
library(tidyr)
complete(df1, Country, Year = 1948:2021, list(GDP = 0)) %>%
arrange(Country)
【解决方案2】:
我们可以使用complete,然后是filter,最后是replace_na。
library(dplyr)
df <-read.table(header=TRUE, text="Country Year GDP
Afghanistan 1950 $123
Afghanistan 1951 $123
Afghanistan 2019 $123
Australia 1945 $123
Australia 2021 $123")
df <- df %>%
complete(Year = 1948:2021, Country) %>%
filter(between(Year, 1948, 2021)) %>%
replace_na(list(GDP = 0)) %>%
arrange(Country)
head(df)
tail(df)
> print(head(df))
# A tibble: 6 x 3
Year Country GDP
<int> <chr> <chr>
1 1948 Afghanistan 0
2 1949 Afghanistan 0
3 1950 Afghanistan $123
4 1951 Afghanistan $123
5 1952 Afghanistan 0
6 1953 Afghanistan 0
> print(tail(df))
# A tibble: 6 x 3
Year Country GDP
<int> <chr> <chr>
1 2016 Australia 0
2 2017 Australia 0
3 2018 Australia 0
4 2019 Australia 0
5 2020 Australia 0
6 2021 Australia $123
由reprex package (v2.0.1) 于 2021-09-26 创建
【解决方案3】:
library(tidyr)
library(dplyr)
df <-
tibble::tribble(
~Country, ~Year, ~GDP,
"Afghanistan", 1950L, "$123",
"Afghanistan", 1951L, "$123",
"Afghanistan", 2019L, "$123",
"Australia", 1945L, "$123",
"Australia", 2021L, "$123"
)
df %>%
filter(Year >= 1948 & Year <= 2021) %>%
complete(Year = 1948:2021,Country) %>%
arrange(Country)
# A tibble: 148 x 3
Year Country GDP
<int> <chr> <chr>
1 1948 Afghanistan NA
2 1949 Afghanistan NA
3 1950 Afghanistan $123
4 1951 Afghanistan $123
5 1952 Afghanistan NA
6 1953 Afghanistan NA
7 1954 Afghanistan NA
8 1955 Afghanistan NA
9 1956 Afghanistan NA
10 1957 Afghanistan NA
# ... with 138 more rows
【解决方案4】:
这是complete 和coalesce 的解决方案
library(dplyr)
library(tidyr)
df %>%
complete(Year = 1948:2021, Country) %>%
arrange(Country, Year) %>%
mutate(GDP = coalesce(GDP, "0"))
# A tibble: 149 x 3
Year Country GDP
<int> <chr> <chr>
1 1948 Afghanistan 0
2 1949 Afghanistan 0
3 1950 Afghanistan $123
4 1951 Afghanistan $123
5 1952 Afghanistan 0
6 1953 Afghanistan 0
7 1954 Afghanistan 0
8 1955 Afghanistan 0
9 1956 Afghanistan 0
10 1957 Afghanistan 0
# … with 139 more rows