Простая функция для нормализации связанных объектов

Я довольно новичок в R и пытаюсь написать функцию, которая нормализует мои данные в разных фреймах данных.

Процесс нормализации довольно прост, я просто делю числа, которые я хочу нормализовать, на размер совокупности для каждого объекта (который хранится в заполнении таблицы). Чтобы узнать, какой объект относится к одному и другому, я попытался использовать идентификаторы, которые хранятся в каждом кадре данных в первом столбце.

Я подумал об этом, потому что некоторые объекты, которые находятся в фрейме данных о населении, не имеют соответствующих объектов в фреймах данных, которые должны быть нормализованы, например, у фреймов данных иногда есть меньшие объекты.

Обычно можно создать реляционную базу данных (которую я пробовал), но у меня это не получилось. Поэтому я попытался связать объекты внутри функции, но функция не сработала. Может быть, кто-то из вас имеет опыт в этом и может мне помочь.

поэтому моя попытка написать эту функцию была:

    # 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)

1 ответ

Решение

Давайте начнем с шагов прикрепления... почему? Обычно это не нужно и может привести к неприятностям! Тем более что и ваш data.frame, и ваш урожай data.frame имеют геокод в виде столбца!

как предлагается в комментариях, вы можете использовать merge, Это по умолчанию объединит data.frames, используя столбцы с тем же именем. Вы можете указать, какие столбцы объединять с by параметры.

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

Причина, по которой ваша функция не работает? Посмотрите на результаты вашего if statemnt.

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

Дает вектор логических значений, который будет перерабатывать более короткий вектор. Если ваши данные достаточно велики (порядка миллионов строк), merge функция может быть медленной. если это так, взгляните на data.table пакет и использовать вместо этого его функцию слияния.

Другие вопросы по тегам