我一直在广泛搜索,但找不到解决方法。
我有一个数据帧(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相同。
非常感谢您!
答案 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"))