Умножьте определенную часть кадра данных на два условия r

У меня есть набор данных, который выглядит так, он называется Data:

Country Region      Code Product name Year Value
Sweden  Stockholm   123  Apple        1991 244   
Sweden  Kirruna     123  Apple        1987 100
Japan   Kyoto       543  Pie          1987 544
Denmark Copenhagen  123  Apple        1998 787
Denmark Copenhagen  123  Apple        1987 100
Denmark Copenhagen  543  Pie          1991 320
Denmark Copenhagen  126  Candy        1999 200
Sweden  Gothenburg  126  Candy        2013 300
Sweden  Gothenburg  157  Tomato       1987 150
Sweden  Stockholm   125  Juice        1987 250
Sweden  Kirruna     187  Banana       1998 310
Japan   Kyoto       198  Ham          1987 157
Japan   Kyoto       125  Juice        1987 550
Japan   Tokyo       125  Juice        1991 100

Я хочу преобразовать value (продажи) в евро по отношению к конкретным country и year. Для этого у меня есть файл данных, который я сделал с обменными курсами для конкретных country и year (которые также скорректированы с учетом инфляции):

Exchange_rates <- read_excel("Data/Exchange_rates.xlsx", col_types = c("numeric", "text", "numeric")) #year, country, value

Чтобы получить значение, которое мне нужно для country и year, я использую этот код:

Convert_exchage_rate <- function(Specific_Country, Specific_Year) {
    Specific_exchange_rate <- subset(Exchange_rates, Country == Specific_Country)
    Specific_exchange_rate <- subset(Specific_exchange_rate, Year == Specific_Year)
    Specific_exchange_rate <- as.matrix(Specific_exchange_rate[3]) #gets the specific rate for the specific year

    Data <- ??? * Specific_exchange_rate[1] #here comes my question 

}

Convert_exchage_rate("Sweden","1987")

Моя проблема в том, что я не знаю, как использовать R для умножения только value только для записей в Data, где "Country == Sweden" и "Year = 1987" (Specific_Country и Specific_Year в функции выше). Я знаю, как умножить столбец значения how на Data$Value <- Data$Value * Specific_exchange_rate[1], но теперь как это сделать условно с двумя условиями.

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


person KGB91    schedule 27.09.2018    source источник
comment
Я думаю, вам просто нужно подмножество соответствующих строк. Data$Value[Data$Country == "Sweden" & Data$Year == 1987]. Заменить Data$Value[Data$Country == Specific_Country & Data$Year == Specific_Year] вместо ??? в вашей функции?   -  person Ronak Shah    schedule 27.09.2018
comment
Я думаю, вы можете оставить страну и год присоединения из файла Excel в основной файл, а после этого просто умножьте продажи на обменный курс   -  person Hunaidkhan    schedule 27.09.2018
comment
Ах, спасибо, теперь я знаю, как поставить два условия. Это будет очень полезно, спасибо!   -  person KGB91    schedule 27.09.2018


Ответы (1)


В закомментированной строке вашей функции вы можете сделать

Data$Value[Data$Country == Specific_Country & Data$Year == Specific_Year] <-
Data$Value[Data$Country == Specific_Country & Data$Year == Specific_Year] * Specific_exchange_rate[1]

Это должно быть самоочевидным: вы выбираете конкретные значения Data $, которые соответствуют вашим Specific_Country и Specific_Year.

Вы можете избежать цикла, выполнив следующие

Data <- merge(Data, Exchange_rates, by=c('Country','Year'))
Data$Value_in_eur <- Data$Specific_exchange_rate * Data$Value
person Otto Kässi    schedule 27.09.2018
comment
Кажется, это работает, большое спасибо! Только один вопрос: мой файл данных с обменными курсами содержит больше лет (2000-2017), чем для некоторых стран в этих данных о продажах. Например, для Дании в реальных данных у меня есть данные о продажах только за 2010-2017 годы, но у меня есть обменные курсы за 2000-2017 годы. Имеет ли это значение, когда я использую merge? - person KGB91; 27.09.2018
comment
По умолчанию слияние использует внутреннее соединение. Т.е. итоговый фрейм данных содержит только наблюдения для строк, в которых совпадают столбцы страны и года в двух наборах данных. Подробнее см. ?merge, в частности переключатели all.x и all.y. - person Otto Kässi; 27.09.2018
comment
Спасибо! Я проверю - ваше решение было идеальным. - person KGB91; 28.09.2018