Проблема:
У меня довольно неприятная проблема. Я пытаюсь написать функцию, которая создала бы / заполняла новый столбец в любом данном кадре данных, основываясь на значениях в двух уже существующих столбцах этого кадра данных.
Контекст:
Я часто работаю с базой данных, которая ссылается на события с двумя измерениями (ID проекта (1-7) и localeID (de_DE, fr_FR, jp_JP и т. Д.).
projectId localeId
1 jp_JP
2 es_ES
3 de_DE
1 jp_JP
2 es_ES
3 de_DE
Мне нужно выполнить ETL из базы данных и создать новое «рыночное» измерение, основанное на projectId и localeID. Например, projectId, равный 1, и localeId, равный jp_JP, могут означать, что рынком является «JAPAN1».
projectId localeId market
1 jp_JP JAPAN1
2 es_ES SPAIN2
3 au_AU AUS3
4 us_US US4
5 en_EN ENGLAND5
6 de_DE GERMANY6
Текущий успешный код:
Напишите сейчас У меня есть длинный фрагмент кода R, использующий функции ifelse. I.E ....
df$market <- ifelse(df$localeId == "jp_JP" & df$projectId == '1', "JAPAN1")
df$market <- ifelse(df$localeId == "es_ES" & df$projectId == '10', "SPAIN10")
Это ... хорошо. Это делает работу. К сожалению, у меня есть много скриптов, которые имеют дело с этой функцией рынка, и я не хочу копировать и вставлять этот код ifelse снова и снова. Вместо этого я хочу написать функцию, которую можно использовать на любом фрейме данных для создания нового рыночного столбца на основе localeId и projectId.
Попытки / Неудачные решения:
market_names <- function(df, "market", "projectId", "localeId"){
df$market <- NA
x <- ifelse(projectId == 1, "1",
ifelse(projectId == 2, "2", projectId)
y <- ifelse(localeId == "jp_JP", "JAPAN",
ifelse(localeId == "es_ES", "SPAIN", localeId)
for(i in 1:nrow(df)){
df[i,]$market <- paste(x,y, sep = "")
}
df <- market_names(df, "market", "projectId", "localeId")
К сожалению, код просто ломается и даже не запускается, когда я пытаюсь передать фрейм данных в функцию.
Запрос:
Я надеюсь, что кто-то здесь испытывал подобные проблемы и мог бы посоветовать, как исправить эту функцию, чтобы ее можно было использовать для любого фрейма данных в любое время. У меня всегда одни и те же размеры projectId и localeId, поэтому я подумал, что это сэкономит мне много времени в будущем.
Если вы думаете, что есть более простой способ сделать все это даже без функции, я бы тоже хотел услышать ваши мысли!
Заранее спасибо!