假设我有以下数据

DT <- data.table(id = c(1,1,1,2,2,3,3),
                bank=c("a","b","b","b","b","a","b"),
                rate =c(2,3,4,1,0.5,7,3.2),
                balance=c(10,5,11,3,20,0.5,2),
                new=c(1,0,0,1,0,0,1),
                before=c(1,0,1,1,0,1,0))

    id bank rate balance new before
1:  1    a  2.0    10.0   1      1
2:  1    b  3.0     5.0   0      0
3:  1    b  4.0    11.0   0      1
4:  2    b  1.0     3.0   1      1
5:  2    b  0.5    20.0   0      0
6:  3    a  7.0     0.5   0      1
7:  3    b  3.2     2.0   1      0

我想向所有行添加一个列,其中包含各银行的平均新贷款率(new==1).我能做的最多的就是

aft <- DT[new==1,.(mrate=mean(rate)),by=bank]
aft <-  merge(DT,aft, by="bank", all.x = T)

   bank id rate balance new before mrate
1:    a  1  2.0    10.0   1      1   2.0
2:    a  3  7.0     0.5   0      1   2.0
3:    b  1  3.0     5.0   0      0   2.1
4:    b  1  4.0    11.0   0      1   2.1
5:    b  2  1.0     3.0   1      1   2.1
6:    b  2  0.5    20.0   0      0   2.1
7:    b  3  3.2     2.0   1      0   2.1

有没有办法避免合并步骤.如有任何帮助,我们不胜感激.谢谢.

推荐答案

DT[, mrate := mean(rate[new == 1]), by = .(bank)]
#       id   bank  rate balance   new before mrate
#    <num> <char> <num>   <num> <num>  <num> <num>
# 1:     1      a   2.0    10.0     1      1   2.0
# 2:     1      b   3.0     5.0     0      0   2.1
# 3:     1      b   4.0    11.0     0      1   2.1
# 4:     2      b   1.0     3.0     1      1   2.1
# 5:     2      b   0.5    20.0     0      0   2.1
# 6:     3      a   7.0     0.5     0      1   2.0
# 7:     3      b   3.2     2.0     1      0   2.1

如果银行没有new == 1行的变化,那么你将得到NaN:

DT[1,new:=0]
DT[, mrate := mean(rate[new == 1]), by = .(bank)]
#       id   bank  rate balance   new before mrate
#    <num> <char> <num>   <num> <num>  <num> <num>
# 1:     1      a   2.0    10.0     0      1   NaN
# 2:     1      b   3.0     5.0     0      0   2.1
# 3:     1      b   4.0    11.0     0      1   2.1
# 4:     2      b   1.0     3.0     1      1   2.1
# 5:     2      b   0.5    20.0     0      0   2.1
# 6:     3      a   7.0     0.5     0      1   NaN
# 7:     3      b   3.2     2.0     1      0   2.1

如果这是一个问题,您可以使用平均值周围的fcoalesce来指定一个缺省值;我在这里使用-1只是为了清楚地说明我正在谈论的内容:

DT[, mrate := fcoalesce(mean(rate[new == 1]), -1), by = .(bank)]
#       id   bank  rate balance   new before mrate
#    <num> <char> <num>   <num> <num>  <num> <num>
# 1:     1      a   2.0    10.0     0      1  -1.0
# 2:     1      b   3.0     5.0     0      0   2.1
# 3:     1      b   4.0    11.0     0      1   2.1
# 4:     2      b   1.0     3.0     1      1   2.1
# 5:     2      b   0.5    20.0     0      0   2.1
# 6:     3      a   7.0     0.5     0      1  -1.0
# 7:     3      b   3.2     2.0     1      0   2.1

R相关问答推荐

收件箱摘要表布局在第一列上显示子类别

rvest函数read_html_live()不允许html_elements()正确读取

从具有随机模式的字符串中提取值

无法在我的情节中表现出显着的差异

删除facet_wrap标签之间的水平线

查找图下的面积

随机森林回归:下拉列重要性

用预测NLS处理R中生物学假设之上的误差传播

在特定Quarto(reveal.js)幻灯片上隐藏徽标

在另一个函数中调用ggplot2美学

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

更新R中的数据表(使用data.table)

基于Key->Value数据帧的基因子集相关性提取

我如何go 掉盒子图底部的数字?

在gggraph中显示来自不同数据帧的单个值

观察器中的inaliateLater的位置

是否可以将线性模型的p值添加到tbl_summary中

为R中的16组参数生成10000个样本的有效方法是什么?

计算来自单独分组的分幅的值的百分位数

按组使用dummy r获取高于标准的行的平均值