0

我对 R 很陌生,我正在尝试编写一个函数来规范化我在不同数据帧中的数据。

标准化过程非常简单,我只需将要标准化的数字除以每个对象的总体大小(存储在表中)。为了知道哪个对象与一个和另一个相关,我尝试使用存储在第一列中每个数据帧中的 ID。

我想这样做是因为人口数据框中的某些对象在要规范化的数据框中没有相应的对象,也就是说,数据框有时具有较少的对象。

通常人们会建立一个关系数据库(我尝试过),但对我来说并没有成功。因此,我尝试将函数中的对象关联起来,但该函数不起作用。也许你们当中有人有这方面的经验,可以帮助我。

所以我编写这个函数的尝试是:

    # Load Tables
    # Agriculture, Annual Crops
    table.annual.crops <-read.table ("C:\\Users\\etc", header=T,sep=";")
    # Agriculture, Bianual and Perrenial Crops
    table.bianual.crops <-read.table ("C:\\Users\\etc", header=T,sep=";")
    # Fishery
    table.fishery <-read.table ("C:\\Users\\etc", header=T,sep=";")
    # Population per Municipality
    table.population <-read.table ("C:\\Users\\etc", header=T,sep=";")

    # attach data
    attach(table.annual.crops)
    attach(table.bianual.crops)
    attach(table.fishery)
    attach(table.population)


    # Create a function to normalize data
    # Objects should be related by their ID in the first column
    # Values to be normalized and the population appear in the second column
    funktion.norm.percapita<-function (x,y){if(x[,1]==y[,1]){x[,2]/y[,2]}else{return("0")}}

    # execute the function
    funktion.norm.percapita(table.annual.crops,table.population)
4

1 回答 1

5

让我们从附加步骤开始......为什么?它通常是不必要的,会给你带来麻烦!特别是因为您的人口 data.frame 和您的作物 data.frame 都有地理编码作为一列!

正如评论中所建议的,您可以使用merge. 默认情况下,这将使用同名的列组合 data.frames。by您可以指定要与参数合并的列。

dat <- merge(table.annual.crops, table.population)
dat$crop.norm <- dat$CropValue / dat$Population

您的功能不起作用的原因是什么?看看你的ifstatemnt的结果。

table.annual.crops[,1] == table.population[,1]

给出一个布尔向量,它将循环使用较短的向量。如果您的数据非常大(大约数百万行),则该merge函数可能会很慢。如果是这种情况,请查看data.table包并改用它的合并功能。

于 2012-11-13T15:50:30.253 回答