R-在每一行中创建具有不同计算的新列

时间:2018-10-21 22:54:51

标签: r datatable tidyverse

我一直在广泛搜索,但找不到解决方法。

我有一个数据帧(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]

我基本上试图在前三行中执行相同的计算,但是与其附加这些计算,它只是在R中返回了一个数字。

有没有一种方法可以创建新列,同时执行不同的计算并在变量列中保持相同的行名?我可以在dyplyr中进行突变,从而对每一行进行相同的计算(即2014和2015列的增加),创建一个新列,但无法进行不同的计算。与data.table相同。

非常感谢您!

1 个答案:

答案 0 :(得分:1)

我认为一种更可靠的方法是创建所需的列(在这种情况下,前两行的总和用于第三列),然后使用诸如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"))