世界银行是否有重塑数据的R函数
我正在尝试重塑数据,但仍有错误。这里有一些关于重塑的非常有用的线索,但我还没有看到我的特殊问题。我试图从长到宽,但都有国家名称和日期作为id,通常我已经看到了使日期成为新列的解决方案世界银行是否有重塑数据的R函数,r,dataframe,data-cleaning,R,Dataframe,Data Cleaning,我正在尝试重塑数据,但仍有错误。这里有一些关于重塑的非常有用的线索,但我还没有看到我的特殊问题。我试图从长到宽,但都有国家名称和日期作为id,通常我已经看到了使日期成为新列的解决方案 #Data from: library(wbstats) WorldBank_long <- wb(indicator = c("NY.GDP.PCAP.KD", "SI.POV.GINI", "UNEMPSA_","CPTOTSAXMZG
#Data from:
library(wbstats)
WorldBank_long <- wb(indicator = c("NY.GDP.PCAP.KD", "SI.POV.GINI", "UNEMPSA_","CPTOTSAXMZGY" ),
startdate = 2005, enddate = 2019)
WorldBank <- WorldBank_long[,c("iso3c", "date", "value", "indicatorID")]
错误:缺少聚合函数:默认为长度
---列是我想要的,但值不是0或1
编辑:
当前表
iso3c date value indicatorID
1 ARB 2019 6437.167 NY.GDP.PCAP.KD
2 ARB 2018 6465.474 NY.GDP.PCAP.KD
3 ARB 2017 6454.460 NY.GDP.PCAP.KD
4 ARB 2016 6506.271 NY.GDP.PCAP.KD
5 ARB 2015 6418.029 NY.GDP.PCAP.KD
6 ARB 2014 6350.838 NY.GDP.PCAP.KD
7 ARB 2013 6333.027 NY.GDP.PCAP.KD
8 ARB 2012 6274.111 NY.GDP.PCAP.KD
9 ARB 2011 6020.487 NY.GDP.PCAP.KD
10 ARB 2010 5934.291 NY.GDP.PCAP.KD
11 ARB 2009 5806.185 NY.GDP.PCAP.KD
我想要做的是——只需要使用上面的值而不是0和1(这是我从(data.table)的输出):
编辑2
新命令看起来比所有其他输出都好,但我的所有值(即人均GDP或基尼值)现在都被重复,因此除定义的列外,所有其他列都是NA。但向下滚动时,GDP变为NA,基尼值也变为NA
#using new command:
WorldBank_data_wide<-WorldBank %>%
mutate(row = row_number()) %>% pivot_wider(names_from = indicatorID, values_from = value)
#output
iso3c date row. NY.GDP.PCAP.KDSI.POV.GINIUNEMPSA_CPTOTSAXMZGY
2138 BDI 2019 1126 208.0747 NA NA NA
2139 BDI 2018 1127 210.8042 NA NA NA
2140 BDI 2017 1128 214.1392 NA NA NA
2141 BDI 2016 1129 219.9615 NA NA NA
2152 BDI 2005 1140 221.0964 NA NA NA
2151 BDI 2006 1139 225.6222 NA NA NA
2150 BDI 2007 1138 225.8591 NA NA NA
2142 BDI 2015 1130 228.4325 NA NA NA
2149 BDI 2008 1137 229.1485 NA NA NA
2148 BDI 2009 1136 230.1926 NA NA NA
2592 ETH 2005 1580 233.9442 NA NA NA
#使用新命令:
世界银行数据范围%
变异(row=row\u number())%%>%pivot\u加宽(名称\u from=indicator,值\u from=value)
#输出
iso3c日期行.NY.GDP.PCAP.KDSI.POV.GINIUNEMPSA_cptotsaxmmzgy
2138 BDI 2019 1126 208.0747不适用
2139 BDI 2018 1127 210.8042不适用
2140 BDI 2017 1128 214.1392不适用
2141 BDI 2016 1129 219.9615不适用
2152 BDI 2005 1140 221.0964不适用
2151 BDI 2006 1139 225.6222不适用
2150 BDI 2007 1138225.8591不适用
2142 BDI 2015 1130 228.4325不适用
2149 BDI 2008 1137 229.1485不适用
2148 BDI 2009 1136 230.1926不适用
2592 ETH 2005 1580 233.9442不适用
编辑:
另一个不可预见的问题——一些命令正在工作,但不是每一行都是唯一的国家和年份——一些命令被重复,因此2013年阿根廷有多行(例如)
World\u bank\u wide%
分组依据(iso3c,指标)%>%
突变(行id=1:n())%%>%ungroup()%%>%
价差(指示符,值)%>%
选择(-row\u id)
行iso3c日期CPTOTSAXMMZGY NY.GDP.PCAP.KD SI.POV.GINI UNEMPSA_
1 ABW 2005 NA 26979.8854 NA
104为2011年NA 34634.862 NA
105为2012年不适用35416.892不适用
106为2013年不适用36978.833不适用
107是2014年NA 32.5 NA
108是2014年北美38495.046北美
109为2015 NA 40247.747 NA
110是2016 NA 41045.111 NA
111个为2017 NA 41460.283 NA
使用以下代码
library(tidyverse)
WorldBank_data_wide<-WorldBank %>%
mutate(row = row_number()) %>%
pivot_wider(names_from = indicatorID, values_from = value)
库(tidyverse)
世界银行数据范围%
变异(行=行编号())%>%
枢轴(名称从=指示符,值从=值)
使用以下代码
library(tidyverse)
WorldBank_data_wide<-WorldBank %>%
mutate(row = row_number()) %>%
pivot_wider(names_from = indicatorID, values_from = value)
库(tidyverse)
世界银行数据范围%
变异(行=行编号())%>%
枢轴(名称从=指示符,值从=值)
一些搜索导致了此解决方案:
库(wbstats)
世界银行长%ungroup()%>%
价差(指示符,值)%>%
选择(-row\u id)
输出:
> World_bank_wide[1:3,]
# A tibble: 3 x 6
iso3c date CPTOTSAXMZGY NY.GDP.PCAP.KD SI.POV.GINI UNEMPSA_
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 ABW 2005 NA 26980. NA NA
2 ABW 2006 NA 27046. NA NA
3 ABW 2007 NA 27428. NA NA
>世界银行[1:3]
#一个tibble:3x6
iso3c日期CPTOTSAXMMZGY NY.GDP.PCAP.KD SI.POV.GINI UNEMPSA_
1 ABW 2005 NA 26980。NA NA
2 ABW 2006 NA 27046。NA NA
3 ABW 2007 NA 27428。NA NA
我不知道如何发布输出,但它与上面列出的一样
编辑:了解了如何发布输出。我使用RStudio自动将输出填充到表中。相反,将其放入控制台并复制/粘贴输出是有效的。一些搜索导致了此解决方案:
库(wbstats)
世界银行长%ungroup()%>%
价差(指示符,值)%>%
选择(-row\u id)
输出:
> World_bank_wide[1:3,]
# A tibble: 3 x 6
iso3c date CPTOTSAXMZGY NY.GDP.PCAP.KD SI.POV.GINI UNEMPSA_
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 ABW 2005 NA 26980. NA NA
2 ABW 2006 NA 27046. NA NA
3 ABW 2007 NA 27428. NA NA
>世界银行[1:3]
#一个tibble:3x6
iso3c日期CPTOTSAXMMZGY NY.GDP.PCAP.KD SI.POV.GINI UNEMPSA_
1 ABW 2005 NA 26980。NA NA
2 ABW 2006 NA 27046。NA NA
3 ABW 2007 NA 27428。NA NA
我不知道如何发布输出,但它与上面列出的一样
编辑:了解了如何发布输出。我使用的是RStudio,它可以自动将输出填充到表中。相反,将其放入控制台并复制/粘贴输出是有效的。基于上面的一些编辑,我认为您可能正在寻找类似的内容。首先,您要创建一个变量
id
,以便每行都有一个unique值(否则,在使用pivot\u-wider
时将返回错误)。然后,使用pivot\u-wider
将数据从长到宽分散,然后删除id
变量。最后,您只选择唯一的行值(删除重复项),然后按iso3c
和日期进行排序
编辑:由于您需要跨行聚合,NA
值跨越数值列,因此您可以汇总值不NA
的行,以获得每个iso3c
日期的行数。然后您可以将NA
数值替换为0
library(wbstats)
library(tidyverse)
WorldBank_long <- wb(indicator = c("NY.GDP.PCAP.KD", "SI.POV.GINI", "UNEMPSA_","CPTOTSAXMZGY" ),
startdate = 2005, enddate = 2019)
WorldBank <- WorldBank_long[,c("iso3c", "date", "value", "indicatorID")]
WorldBank %>%
mutate(id = row_number()) %>%
pivot_wider(names_from = indicatorID, values_from = value) %>%
select(-id) %>%
distinct() %>%
arrange(iso3c, date) %>%
group_by(iso3c, date) %>%
mutate_all(as.character) %>%
summarise(across(.cols = everything(), .fns = ~ .[!is.na(.)][1])) %>%
mutate_at(c("NY.GDP.PCAP.KD","SI.POV.GINI", "UNEMPSA_", "CPTOTSAXMZGY"), as.numeric) %>%
mutate(across(where(is.numeric), ~replace_na(., 0)))
根据上面的一些编辑,我认为您可能正在寻找类似的内容。首先,您要创建一个变量id
,以便每一行都有一个唯一的值(否则,在使用pivot\u
时会返回一个错误)。然后,使用pivot\u wide
将数据从长到宽展开,然后删除id
变量。最后,您只需选择唯一的行值(删除重复项),然后按iso3c
和日期进行排序
编辑:由于您需要跨行聚合,NA
值跨越数值列,因此您可以汇总
值不是NA
的行以获得一个值
> World_bank_wide[1:3,]
# A tibble: 3 x 6
iso3c date CPTOTSAXMZGY NY.GDP.PCAP.KD SI.POV.GINI UNEMPSA_
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 ABW 2005 NA 26980. NA NA
2 ABW 2006 NA 27046. NA NA
3 ABW 2007 NA 27428. NA NA
library(wbstats)
library(tidyverse)
WorldBank_long <- wb(indicator = c("NY.GDP.PCAP.KD", "SI.POV.GINI", "UNEMPSA_","CPTOTSAXMZGY" ),
startdate = 2005, enddate = 2019)
WorldBank <- WorldBank_long[,c("iso3c", "date", "value", "indicatorID")]
WorldBank %>%
mutate(id = row_number()) %>%
pivot_wider(names_from = indicatorID, values_from = value) %>%
select(-id) %>%
distinct() %>%
arrange(iso3c, date) %>%
group_by(iso3c, date) %>%
mutate_all(as.character) %>%
summarise(across(.cols = everything(), .fns = ~ .[!is.na(.)][1])) %>%
mutate_at(c("NY.GDP.PCAP.KD","SI.POV.GINI", "UNEMPSA_", "CPTOTSAXMZGY"), as.numeric) %>%
mutate(across(where(is.numeric), ~replace_na(., 0)))
iso3c date NY.GDP.PCAP.KD SI.POV.GINI UNEMPSA_ CPTOTSAXMZGY
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 ARG 2005 8578. 48 11.6 0
2 ARG 2006 9175. 46.7 10.2 0
3 ARG 2007 9902. 46.6 8.45 0
4 ARG 2008 10201. 45.3 7.86 0
5 ARG 2009 9502. 44.1 8.67 0
6 ARG 2010 10386. 44.5 7.75 0
7 ARG 2011 10883. 42.7 7.15 0
8 ARG 2012 10650. 41.4 7.21 0
9 ARG 2013 10785. 41 7.08 0
10 ARG 2014 10399. 41.7 7.27 0
11 ARG 2015 10568. 0 6.61 0
12 ARG 2016 10239. 42 8.47 0
13 ARG 2017 10404. 41.2 8.35 0
14 ARG 2018 10044. 41.4 9.24 0
15 ARG 2019 9729. 0 0 0
library(wbstats)
nations<-wbcountries()
GDP <- wb(indicator = c("NY.GDP.PCAP.KD"),
startdate = 2005, enddate = 2019)
GDP <- GDP[,c("iso3c", "date", "value")]
names(GDP)
names(GDP)<-c("iso3c", "date", "GDP.PC")
#example of new dataset:
iso3c date GDP.PC
1 ARB 2019 6437.167
2 ARB 2018 6465.474
3 ARB 2017 6454.460
4 ARB 2016 6506.271
5 ARB 2015 6418.029
Gini <- wb(indicator = c("SI.POV.GINI"),
startdate = 2005, enddate = 2019)
Gini <- Gini[,c("iso3c", "date", "value")]
names(Gini)
names(Gini)<-c("iso3c", "date", "Gini")
Unemp <- wb(indicator = c("UNEMPSA_"),
startdate = 2005, enddate = 2019)
Unemp <- Unemp[,c("iso3c", "date", "value")]
names(Unemp)
names(Unemp)<-c("iso3c", "date", "UnemploymentRate")
Rate <- wb(indicator = c("CPTOTSAXMZGY" ),
startdate = 2005, enddate = 2019)
Rate <- Rate[,c("iso3c", "date", "value")]
names(Rate)
names(Rate)<-c("iso3c", "date", "Rate")
World_bank_wide <- merge(GDP, Gini, by = c("iso3c", "date"))
World_bank_wide <- merge(World_bank_wide, Unemp, by = c("iso3c", "date"))
#final output
iso3c date GDP.PC Gini UnemploymentRate
1 ARG 2005 8577.865 48.0 11.5604135
2 ARG 2006 9174.502 46.7 10.1507404
3 ARG 2007 9901.512 46.6 8.4456562
4 ARG 2008 10201.476 45.3 7.8568969
5 ARG 2009 9502.244 44.1 8.6676318
6 ARG 2010 10385.964 44.5 7.7457817
7 ARG 2011 10883.315 42.7 7.1539098