【问题标题】:(Basic) subtract and multiply within group in R(基本)R中的组内减法和乘法
【发布时间】:2020-05-16 20:48:38
【问题描述】:

我想在 R 中为每组X 编写以下代码:

(Y-1) * 1/3 * Z/100

因此,第 2 行的输出为:(2-1) * 1/3 * 25 / 100 = 0.083

第 2 行和第 8 行所需的输出也作为示例添加

  X  Y   Z output   
1 A  1  25      0
2 A  2  25   0.08
3 A  3   0      0  
4 A  4  50    0.5
5 B  1   0      0
6 B  2   0      0
7 B  3   0      0
8 B  4 100      1

谢谢!!

【问题讨论】:

  • 为什么需要group by with(df1, (Y-1) * 1/3 * Z /100) 因为预期只有两行,不清楚
  • 这些都是矢量化的,所以应该比较高效
  • 你能测试一下你数据上的代码吗
  • 你的计算是基于每个元素而不是基于一个组(除非我错了)
  • with base R 函数。在不使用$[[[ 的情况下选择列很方便,即如果我不使用with。代码是(df1$Y-1) * 1/3 * df1$Z/100,你能测试我帖子上的数据吗?

标签: r dataframe math data-manipulation


【解决方案1】:

data.table 可以提高一点效率

library(data.table)
setDT(df1)[,  output := sum((Y-1) * 1/3 * Z /100), X]
df1
#   X Y   Z    output
#1: A 1  25 0.5833333
#2: A 2  25 0.5833333
#3: A 3   0 0.5833333
#4: A 4  50 0.5833333
#5: B 1   0 1.0000000
#6: B 2   0 1.0000000
#7: B 3   0 1.0000000
#8: B 4 100 1.0000000

如果我们还需要按另一个变量分组,请在 list.( 中指定它

setDT(df1)[,  output := sum((Y-1) * 1/3 * Z /100), by = .(X, year)]

或者dplyr

library(dplyr)
df1 %>%
     group_by(X) %>%
     mutate(output = sum((Y-1) * 1/3 * Z /100))

或者有更多的变量

df1 %>%
     group_by(X, year) %>%
     mutate(output = sum((Y-1) * 1/3 * Z /100))

注意:输入数据中不显示“年份”。来自OP的原始数据

数据

df1 <- structure(list(X = c("A", "A", "A", "A", "B", "B", "B", "B"), 
    Y = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), Z = c(25L, 25L, 0L, 
    50L, 0L, 0L, 0L, 100L)), row.names = c("1", "2", "3", "4", 
"5", "6", "7", "8"), class = "data.frame")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-31
    • 2014-05-08
    • 2020-04-26
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    相关资源
    最近更新 更多