2015-07-09 2 views
1

У меня есть dataframeR IfElse() вычисляет условие и возвращает соответствие

countryname <- c("Viet Nam", "Viet Nam", "Viet Nam", "Viet Nam", "Viet Nam") 
year <- c(1974, 1975, 1976, 1977,1978) 

df <- data.frame(countryname, year) 

, который находится в длинной стране форматом года.

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

country <- c("Vietnam, North", "Vietnam, N.", "Vietnam North", "Viet Nam", "Democratic Republic Of Vietnam") 
standardize <- c("Vietnam, Democratic Republic of", "Vietnam, Democratic Republic of", "Vietnam, Democratic Republic of", "Vietnam, Democratic Republic of", "Vietnam, Democratic Republic of") 
panel <- c("Vietnam", "Vietnam","Vietnam","Vietnam","Vietnam") 
time <- c(1976,1976,1976,1976,1976) 

cnames <- data.frame(country, standardize, panel, time) 

Функция для стандартизации является

country_name <- function(x) { 
    return(cnames[match(x,cnames$country),]$standardize) 
} 

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

country_panel <- function(x, y) { 

    ifelse(cnames$time < y, 
    return(cnames[match(x, cnames$country),]$panel), 
    return(cnames[match(x, cnames$country),]$standardize) 
) 
} 

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

d1 <- df %>% 
    mutate(new_name = country_panel(countryname, year)) 

Проблема, которую я нахожу в том, что функция оценивает только y в функции country_panel как единый объект, а не в качестве вектора. Если я ввешу целое число, которое больше или меньше cnames$time, оно правильно оценивает, но передает значение для каждой строки.

Как я могу иметь эту функцию оценивать каждый cnames$country и cnames$time отношения к df$year и вернуть правильный cnames$panel или cnames$standardize?

Благодарим за помощь.

+1

Ваша функция 'country_panel' вызывает' panel() ', но код этой функции здесь не включен. –

+0

Спасибо, что должно было быть return() –

+0

Выньте 'return', это прекратит вашу функцию от продолжения. (См. Ответ) –

ответ

1
d1 
# countryname year      new_name 
# 1 Viet Nam 1974 Vietnam, Democratic Republic of 
# 2 Viet Nam 1975 Vietnam, Democratic Republic of 
# 3 Viet Nam 1976 Vietnam, Democratic Republic of 
# 4 Viet Nam 1977       Vietnam 
# 5 Viet Nam 1978       Vietnam 

Все, что вам нужно сделать, это убедиться, что ваши кадры данных устанавливаются stringsAsFactors=F при определении их, то есть (df <- data.frame(countryname, year, stringsAsFactors=F)) , И вынимают команду return:

country_panel <- function(x, y) { 
    ifelse(cnames$time < y, 
    cnames[match(x, cnames$country),]$panel, 
    cnames[match(x, cnames$country),]$standardize 
) 
} 

Смысл его в том, что return останавливает функцию в своих направлениях, как только это называется. Таким образом, ваш кадр данных заполняется одним выходным значением. Вот почему они были одинаковыми.

+0

Это работало на коде репликации, но все еще не работает, когда я втягиваю фактический csv, используя read_ 'read_csv', который должен по умолчанию использовать' stringsAsFactors = FALSE' правильно? –

+0

Когда вы запускаете 'str (df)' он говорит 'factor' для любого из столбцов? –

+0

Нет, они либо целые, либо символьные. Я также просто работал с реальными данными с помощью 'read.csv' и устанавливал' stringsAsFactors = FALSE', и он не работает, –

0

Вы можете присоединиться таблицы, основанные на год и страны имя:

left_join(df, cnames, by = c("countryname" = "country", "year" = "time")) 

    countryname year      standardize panel 
1 Viet Nam 1974       <NA> <NA> 
2 Viet Nam 1975       <NA> <NA> 
3 Viet Nam 1976 Vietnam, Democratic Republic of Vietnam 
4 Viet Nam 1977       <NA> <NA> 
5 Viet Nam 1978       <NA> <NA> 
+0

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

+0

Я также должен сказать, что я хочу добавить в пакет, который я разработал [здесь] (https://github.com/dsself/StandardCountries), который обрабатывает данные панели. –

Смежные вопросы