2017-08-15 174 views
0

我去了世界银行的数据库 - 并选择了2个文件 - GDP和识字率。直觉上我知道可能有一个相关性。因此,问题陈述是找出200多个(大约)国家60年来国内生产总值和识字率的相关性。从2个文件中获取某些数据到矩阵

这里是链接;

http://data.worldbank.org/indicator/NY.GDP.PCAP.CD?view=chart [国内生产总值]

http://data.worldbank.org/indicator/SE.ADT.LITR.ZS?view=chart [FOR LIT]

我.csv格式的数据,并跳过从上面几行后阅读。

然后,这是我开始写的代码;

Lit = read.csv("C:/DIRECTORY/API_SE.ADT.LITR.ZS_DS2_en_csv_v2.csv", skip = 3, header = TRUE, dec = ".") 
Gdp = read.csv("C:/DIRECTORY/API_NY.GDP.MKTP.CD_DS2_en_csv_v2.csv", skip = 3, header = TRUE, dec = ".") 



#creating a list of variables for each different year 
#Without initializing the variables here, the code below did not work 

for (i in 5:62) 
{ 
assign(paste0("year", i), 0*i) 
} 



#running a loop for all the values of each dataset 
#The desired result of this in 55 vectors (1 for each year) of some length 
(as there are many missing values) which have in them values of gdp and lit 
of the same country in the same row 

for (y in 5:62){ 
    for (c in 1:264){ 


#checking if values are available as many values are missing 
q = is.na(Gdp[c,y]) 
r = is.na(Lit[c,y]) 

#now we will assign the values to the specific year 

    assign(paste0("year", y), c(Gdp[c,y], Lit[c,y])) 

}} 

我从中得到的是55个向量(标题year1到year55),每个向量有2个值。

我知道发生了什么是每个向量,只有最后一个共存值被设置(之前的那些被下一个等等替代,等等直到最后)。

现在,什么是理想的,是一种增长年份向量的方法,以便它包含给定年份的所有共存(即某个国家,某年某个国家同时具有gdp和光照值)值。

+0

欢迎来到SO。我很难理解你的问题。你是在问如何将数据放在长时间的形式中,以便每个国家和每年的组合都有一行与gdp的观察结果对应,并点亮? – C8H10N4O2

+0

嘿咖啡因​​ - 谢谢。我在询问如何将数据转换为矩阵形式,以便每个矩阵有一年的时间,并且有2列(GDP,LIT)和行数,因为有一个国家的GDP和LIT数据都是在那一年。 。 –

+0

好的 - 如果你通过将代码包含到任何一个[可重现的例子](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)下载并解压缩有问题的文件或(甚至更好的)小矢量示例版本(可能为year1-year3) – C8H10N4O2

回答

0

出于好奇,你以前使用过MATLAB吗?你的方法看起来很像我早就试过的,而我从MATLAB来到R。在可能的情况下,我建议对data.frame中的columns/vars作为一个整体执行操作,而不是试图通过每个单元遍历它们。

请原谅我,如果这个回应格式不好,我相当新的堆栈交换。

我不能完全确定你的目标是什么在这里, 此代码

> for (i in 5:62) { assign(paste0("year", i), 0*i) } 

通过 “year62” 创建57个名为 “year5” 数值目标 “year6”, “year7” 等...每个包含什么,但数量0。这些未连接以任何方式与您的代码的其余部分,并通过代码

for (y in 5:62){ 
    for (c in 1:264){ 


#checking if values are available as many values are missing 
q = is.na(Gdp[c,y]) 
r = is.na(Lit[c,y]) 

#now we will assign the values to the specific year 

    assign(paste0("year", y), c(Gdp[c,y], Lit[c,y])) 

}} 

这在最后部分产生的物体的第二部分将被覆盖并在覆盖它们一样的气息。

至于你所要完成

现在,将是理想的什么什么,是使之 包含所有共存增长的一年矢量(一种方式,即当一个国家,对于一个给定年, 同时具有gdp和lit值)给定年份的值。

这很难,因为选择仅存在于Gdp和Lit中的数据将会创建奇怪的形状数据框。
如果运行

!is.na(Gdp) & !is.na(Lit) 

你可以看到这一点,因为所有的真正价值是多年没有NA在任一数据集中对某一国家和FALSE值都是那些没有。

编辑:

如果我理解你的回应试试这个

mapply(FUN = function(x = Gdp, y = Lit){ 
    output <- cbind(x,y) 
    output[!is.na(x)&!is.na(y),] 
}, x = Gdp[,5:62],y = Lit[,5:62]) 

这样做是为GDP,点燃每一列则返回值当年是正确的,当且仅如果两个值都存在。

它以列表对象的形式返回,列表中的每个条目都是其中一个年份的数据框。我不太确定这是不是你想要的,因为你不再拥有国家标签行,因此不知道每个条目属于哪个国家。您可以通过将数据重新加入名称或修改该代码来保存国名变量来解决此问题,但我会将其留给您。

+0

当时我被介绍给了一些C++,并确实在Matlab上工作,不过我想这更多的与R做绝对noob有关。 您对情况的分析是正确。最终的结果将是一个形状奇怪的数据框。这是预期和想要的。 让我试着再解释一下目标: 得到57个载体(每年1个数据)包含2列(GDP和LIT)。 57个载体在行数上有所不同(取决于不同国家的数量,对于特定年份,具有GDP和LIT值)。 –

+0

非常感谢!这似乎解决了我想要做的事情!我有价值。这真太了不起了! 你能解释一下你是怎么做的? –

+0

当然,对于像这样的情况,对于两个不同数据集中的相应列需要执行相同操作的情况,mapply非常有用。想了解更多,我会引用你的帮助,只需运行'?mapply'。 其余的部分只是一个匿名函数,它将两列(我在参数中设置的x和y作为Gdp和Lit)将它们组合成一个称为输出的数据框,然后过滤输出以仅包含结果其中x和y都不是NA。 –