умножение парных переменных / df (R) - PullRequest
0 голосов
/ 07 января 2020

У меня есть вопрос о парном умножении переменных / df на R.

Рассмотрим следующую проблему: наличие данных в векторе (или в фрейме данных), имеющих метки и значения, следующим образом:

alpha_lab <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
alpha_num <- c(15.28767,  44.38356,  73.47945, 103.56164, 133.64384, 163.72603, 193.80822, 224.38356, 254.46575, 284.54795, 314.63014, 344.71233)

alpha_num является продуктом других вычислений (не имеет значения), следующие значения соответствуют их меткам в alpha_lab (т. Е. Январь = 15.28767, апрель = 103.56164 ...). У меня также есть датафрейм с "case", "month" (как int ), "year" и "value":

> df_values
# A tibble: 1,173 x 4
# Groups:   case, month 
   case    month  year  value
   <chr>   <int> <int>  <dbl>
 1 A1          1  2009  121. 
 2 A1          1  2010  177. 
 3 A1          1  2011  220. 
 4 A1          1  2012  196. 
 5 A1          1  2013  161. 
 6 A1          1  2014  142. 
 7 A1          2  2009   82.3
 8 A1          2  2010  169. 
 9 A1          2  2011  194. 
10 A1          2  2012  169. 
# ... with 1,163 more rows

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

value * alpha_num 

, где alpha_num берется только для расчетного месяца, например:

row 1 (A1, January 2009 case): 121 * 15.28767
row 5 (A1, January 2013 case): 161 * 15.28767
row 7 (A1, February 2011 case): 82.3 * 44.38356

и т. Д. Для каждого случая в каждом месяце каждого года ...

Есть ли способ вычислить это без добавления соответствующего значения alpha_num к df_values ​​ таблица один на один месяц дела?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 07 января 2020

Это должно быть полезно:

library(dplyr)

# original vectors
alpha_lab <- c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")
alpha_num <- c(15.28767,  44.38356,  73.47945, 103.56164, 133.64384, 163.72603, 193.80822, 224.38356, 254.46575, 284.54795, 314.63014, 344.71233)

# example of your dataframe
df_values = data.frame(case = c("A1", "A1"),
                       month = c(1, 2),
                       year = c(2009, 2009),
                       value = c(121, 82.3),  stringsAsFactors = F)

df_values %>% mutate(new_col = value * alpha_num[month])

#   case month year value  new_col
# 1   A1     1 2009 121.0 1849.808
# 2   A1     2 2009  82.3 3652.767

Обратите внимание, что это работает, потому что ваш вектор alpha_lab имеет месяцы в правильном порядке. то есть январь, февраль, ..., De c представляют позиции 1, 2, ..., 12.

1 голос
/ 07 января 2020

Вы также можете попробовать работать с таблицей поиска и dplyr::left_join.

library("magrittr")

sampleData <- tibble::tibble(

  case = "A1", 
  month = rep(1:12, each = 6), 
  year = rep(2009:2014, 12), 
  value = runif(72, 10, 130)


)



lookup_table <- tibble::tibble(

  alpha_lab = c("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),
  alpha_id = 1:12,
  alpha_num = c(15.28767,  44.38356,  73.47945, 103.56164, 133.64384, 163.72603, 193.80822, 224.38356, 254.46575, 284.54795, 314.63014, 344.71233)


)

result <- dplyr::left_join(sampleData, lookup_table, by = c("month" = "alpha_id")) %>%
  dplyr::mutate(new_col = alpha_num * value) %>%
  dplyr::select(-alpha_num, -alpha_lab)

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