【问题标题】:R - create new column with different calculations in each rowR - 在每行中创建具有不同计算的新列
【发布时间】:2019-03-26 00:18:13
【问题描述】:

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

我有一个如下所示的数据框 (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 相同。

非常感谢!

【问题讨论】:

  • 您能否提供更多有关您正在尝试做的事情的背景信息? (例如,可能有更直接的策略。)另外,是根据variable 中的值,还是根据行位置来选择哪个计算进入Bundled 列?你总是有四排吗?等等等等。
  • 有关更多上下文,变量 a 和 b 的第 1 行和第 2 行表示计数。例如,在对应于变量“a”的 2014 列中,它表示计数为 3,对于 2015,计数为 4。因此,在捆绑列中,我只是希望添加这些计数。变量 c 的第 3 行表示计数的比例。对于变量 d 的第 4 行,是完全独立的计算。选择哪个计算进入捆绑列取决于变量。我有多个涉及类似计算的行。很抱歉造成混乱!

标签: r datatable tidyverse


【解决方案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"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 2019-10-18
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    相关资源
    最近更新 更多