首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >update drop和drop

update drop和drop
EN

Stack Overflow用户
提问于 2013-01-07 22:33:33
回答 1查看 147关注 0票数 2

大家好,新年快乐,我想知道data.table是否可以处理基于每个分组的select执行的更新。

代码语言:javascript
复制
R) a=data.table(x=c("a","a","b","b","c","c"),y=c(1,2,3,3,2,1))
R) a
   x y
1: a 1
2: a 2
3: b 3
4: b 3
5: c 2
6: c 1

如果我想要更新每个by-group中的条件,我需要在j中执行select,但这更像是一个选择( i )。

代码语言:javascript
复制
R) a[,c:=ifelse(y==max(y),"yes","no"),by=x]
R) a
   x y   c
1: a 1  no
2: a 2 yes
3: b 3 yes
4: b 3 yes
5: c 2 yes
6: c 1  no

我可以使用像a[y==max(y),c:="yes",by=x,within.by=TRUE]这样的选项来做同样的事情吗?我想它会快得多

第二个问题,是否计划在data.table中使用drop参数,以便能够执行本质上是DT[,':='(x=NULL,y=NULL,z=NULL)]DT[drop="x,y,z"]

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-08 06:15:32

这只是一个猜测,关注并建立在评论之上:which.max(x)可能比x==max(x)更快。

来自?which.max

which.min which.max的Value

长度为1或0的整数(当x没有非NAs),分别给出x的第一个最小值或最大值的索引。如果此极值是唯一的(或为空),则结果分别与which(x == min(x))which(x == max(x))相同(但效率更高)。

所以,可能是这样的:

代码语言:javascript
复制
DT[,c:="no"]
w = DT[,list(IDX=.I[which.max(y)]),by=x]$IDX
DT[w,c:="yes"]

它使用的是i,这可能就是您想要的。结果w是每个组只有一个项目,而不是每个组的.N,因此可能也会更快。不仅仅是which.max本身。但当然,如果最大值可以绑定,那么which.max将只返回第一个值,因此根据您的数据可能并不合适。

如果您进行基准测试,请确保使数据变大(1GB+),并将键控与非键控进行比较。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14197987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档