Как выполнить операцию над фреймом данных в соответствии с другим фреймом данных? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть фрейм данных с именем df, в который я хочу преобразовать суммы в определенных столбцах в евро (заданные переменной $ currency.Code).Для этого у меня есть еще один фрейм данных с именем taux_change_vers_EUR с двумя переменными: (1) название валюты, (2) курс обмена в евро.

Я хотел бы применить коэффициентыиз второго столбца моего фрейма данных taux_change_vers_EUR в несколько столбцов моего фрейма данных df.Проблема в том, что мой df довольно большой и поэтому операция должна быть оптимизирована (ни для цикла).У тебя есть идея?

Вот часть кода.Этот код не работает, но показывает, что я ожидаю:

for (devise in unique(df$currency.Code)){
    df[df$currency.Code==devise,c(4:37,44:48)] <- df[df$currency.Code==devise,c(4:37,44:48)]*rep(as.numeric(taux_change_vers_EU    R[taux_change_vers_EUR[,1]==devise,2]),39)
}

Вот как выглядит мой второй кадр данных:

taux_change_vers_EUR
     V1        V2
1   USD   1.14720
2   CAD   1.48836
3   GBP   0.87869
4   EUR   1.00000
5  <NA>   1.00000
6   DKK   6.50221
7   SEK   9.10235
8   PLN   3.76455
9   CZK  22.49280
10  NOK   8.28273
11  TRY   6.12973
12  TWD  30.98320
13  CNY   6.92256
14  HKD   7.83296
15  JPY 113.16000

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Я создал пример, который вы можете использовать повторно, выполнив:

df <- structure(list(c("EUR", "EUR", "USD", "CAD"), c(1654, 68797, 
                                                6546, 736), c("CNY", "HKD", "HKD", "HKD"), c(6876, 63, 687, 354
                                                )), .Names = c("currency1", "amount1", "currency2", "amount2"
                                                ), class = "data.frame", row.names = c(NA, -4L))

Так что быстрый способ сделать это, , если у вас есть уникальные валюты в taux_change_vers_EUR, используетсяmerge для каждого интересующего вас столбца в df, который вы можете даже просмотреть.

cur1.rate  <- merge(df, taux_change_vers_EUR, by.x="currency1", by.y="V1", all.y=FALSE)
cur2.rate  <- merge(cur1.rate, taux_change_vers_EUR, by.x="currency2", by.y="V1", all.y=FALSE)
result <- cur2.rate
result$amount1.eur <- result$amount1*result$V2.x
result$amount2.eur <- result$amount2*result$V2.y
result
  currency2 currency1 amount1 amount2    V2.x    V2.y amount1.eur amount2.eur
1       CNY       EUR    1654    6876 1.00000 6.92256    1654.000  47599.5226
2       HKD       CAD     736     354 1.48836 7.83296    1095.433   2772.8678
3       HKD       EUR   68797      63 1.00000 7.83296   68797.000    493.4765
4       HKD       USD    6546     687 1.14720 7.83296    7509.571   5381.2435
0 голосов
/ 23 октября 2018

Мы можем использовать матч :

# example data borrowed from @JohnCoene
df1 <- data.frame(
  currency = c("USD", "GBP", "JPY", "CAD"),
  rate = c(1.2, 0.9, 0.8, 1.5))

set.seed(1); df2 <- data.frame(
  value = 1,
  currency = sample(df1$currency, 5, replace = TRUE))

df2$velueNew <- df2$value * df1$rate[ match(df2$currency, df1$currency) ]
df2
#   value currency velueNew
# 1     1      GBP      0.9
# 2     1      GBP      0.9
# 3     1      JPY      0.8
# 4     1      CAD      1.5
# 5     1      USD      1.2
0 голосов
/ 23 октября 2018

Вы должны иметь возможность объединить две data.frame с действительной валютой, а затем конвертировать.Ниже приведены воспроизводимые примеры с использованием dplyr.

library(dplyr)

# create dummy data
currencies <- data.frame(
    currency = c("USD", "GBP", "JPY", "CAD"),
    rate = c(1.2, .9, .8, 1.5)
)

moneyz <- data.frame(
    value = runif(100, 5, 100),
    currency = sample(currencies$currency, 100, replace = TRUE)
)

# merge and convert
moneyz %>% 
    left_join(currencies, by = "currency") %>% # merge
    mutate(
        converted = value * rate # convert
    )

. Мы просто объединяем две таблицы вместе, чтобы получить одну таблицу со значением, валютой, в которой она находится, и соответствующим курсом для преобразования в евро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...