Простая функция для нормализации связанных объектов
Я довольно новичок в 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
пакет и использовать вместо этого его функцию слияния.