R - создать новый столбец с различными вычислениями в каждой строке - PullRequest
0 голосов
/ 22 октября 2018

Я много искал, но не смог найти решение.

У меня есть фрейм данных (df), который выглядит так:

    variable   2014    2015
1      a         3       4     
2      b         2       1
3      c         0       3
4      d         2       3

Я хочу создатьновый столбец, который использует столбцы 2014 и 2015 годов и выполняет следующие вычисления:

    variable   2014    2015    Bundled
1      a         3       4      3+4=7 
2      b         2       1      2+1=3
3      c         0       2      7/3=2.33
4      d         2       3      (3*2 + 4*3)/7

Последний расчет по существу

    (df[1,2]*df[4,2] + df[1,3]*df[4,3])/df[1,4]

В основном я пытался выполнить те же вычисления в первом3 строки, но вместо прикрепления этих вычислений он просто возвращает число в R.

Есть ли способ создать новый столбец, выполняя различные вычисления и поддерживая одинаковые имена строк в столбце переменной?Я мог бы сделать мутации в dyplyr, который выполняет одинаковые вычисления (т.е. добавления столбцов 2014 и 2015 гг.) Для каждой строки, создавая новый столбец, но не смог сделать другие.То же самое с data.table.

Большое спасибо!

1 Ответ

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

Я думаю, что более надежным подходом было бы создание необходимых столбцов (в данном случае суммы из первых двух строк, используемых в третьей), а затем использование чего-то вроде dplyr::case_when для запуска различных вычислений в строке:

library(dplyr)
df2 <- df %>%
  mutate(sums = X2014 + X2015) %>%
  mutate(Bundled = case_when(variable %in% c("a", "b") ~ sums * 1.0,
                             variable == "c"   ~ lag(sums,2) / lag(sums),
                             TRUE ~ (lag(X2014,3) * X2014 +
                                     lag(X2015,3) * X2015) / 7)) %>%
  select(-sums)

> df2
  variable X2014 X2015  Bundled
1        a     3     4 7.000000
2        b     2     1 3.000000
3        c     0     3 2.333333
4        d     2     3 2.571429

(Обратите внимание, это основано на слегка измененном вводе, чтобы избежать столбцов с числовыми именами.)

# data used above:
df <- structure(list(variable = c("a", "b", "c", "d"), X2014 = c(3L, 
2L, 0L, 2L), X2015 = c(4L, 1L, 3L, 3L)), .Names = c("variable", 
"X2014", "X2015"), class = "data.frame", row.names = c("1", "2", 
"3", "4"))
...