让我们保持简单.我有以下DT:

library(data.table)
test <- setDT(data.frame(a=c(1,2,2,1,3,3,3,4,4,4),b=c(1:9,9)))

test[a == 4,sum(b),b]

给予:

   b V1
1: 8  8
2: 9  9

但是为什么呢?第二行的和不应该等于18吗?如果我先使用:

test[a == 4]

我们得到

   a b
1: 4 8
2: 4 9
3: 4 9

很明显,第二个b组的b之和应该是18.我错过了什么?注意:我并不是说命令有多大意义,但我现在正在努力理解它.

推荐答案

您不应该用相同的列b来表示sumgroup,否则您将始终得到一个新的列V1,其值与组列b相同,因为组列b中的每个值都是唯一的,这意味着如果您用b(V1 = b)中的唯一值来表示sum,您将自己得到它.出于您的目的,

dt = data.table(a=c(1,2,2,1,3,3,3,4,4,4),b=c(1:9,9)))
dt[a == 4, .(a = unique(a), b = unique(b), sumb = sum(b)), by = rleid(b)]
#   rleid     a     b  sumb
#   <int> <num> <num> <num>
#1:     1     4     8     8
#2:     2     4     9    18

P、 如果用dt[,c:=b]创建列b的副本,然后try dt[a == 4,sum(b),c],您也可以更好地理解

dt[,c := b][a == 4,sum(b),c]
#       c    V1
#   <num> <num>
#1:     8     8
#2:     9    18

R相关问答推荐

计算R中的威布尔分布的EDF

更改编号列表的 colored颜色

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

如何在一次运行中使用count进行多列计数

一小时满足条件的日期的 Select

使用R中的正则表达式将一列分割为多列

R:从geom_ol()中删除轮廓并导出为pdf

给定开始日期和月份(数字),如何根据R中的开始日期和月数创建日期列

如何在R中通过多个变量创建交叉表?

是否有新方法来更改Facet_WRAP(Ggplot2)中条文本的文本 colored颜色 ?

根据另一列中的值和条件查找新列的值

使用R将简单的JSON解析为嵌套框架

创建列并对大型数据集中的特定条件进行成对比较的更高效程序

Rmarkdown::Render vs Source()

如何预测原始数据集并将值添加到原始数据集中

在生成打印的自定义函数中,可以通过变量将线型或 colored颜色 设置为NULL吗?

R-如何在ggplot2中显示具有不同x轴值(日期)的多行?

如果极点中存在部分匹配,则替换整个字符串

将R中对象的CSV数组转换为JSON数组

用逗号拆分字符串,并删除一些字符