首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用R中的data.table对许多列求和,删除NA

用R中的data.table对许多列求和,删除NA
EN

Stack Overflow用户
提问于 2013-09-23 21:51:34
回答 1查看 11.4K关注 0票数 3

我想这真的是两个问题。我正在尝试使用data.table包来总结一个大型数据集。假设我最初的大型数据集是df1,不幸的是df1有50列(y0...y49),我想要3个字段的和(segmentfield1,segmentfield2,segmentfield3)。有没有比键入每个y0...y49列更简单的方法呢?与此相关的是,有没有data.table的通用na.rm=T,而不是在每个sum中也键入它?

代码语言:javascript
复制
dt1 <- data.table(df1)
setkey(dt1, segmentfield1, segmentfield2, segmentfield3)
dt2 <- dt1[,list( y0=sum(y0,na.rm=T), y1=sum(y1,na.rm=T), y2=sum(y2,na.rm=T), ... 
            y49=sum(y49,na.rm=T) ),
            by=list(segmentfield1, segmentfield2, segmentfield3)]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-23 22:38:57

首先,为正在使用的名称创建对象变量:

代码语言:javascript
复制
colsToSum <- names(dt1)  # or whatever you need
summedNms <- paste0( "y", seq_along(colsToSum) )

如果要将其复制到新的data.table,请执行

代码语言:javascript
复制
dt2 <- dt1[, lapply(.SD, sum, na.rm=TRUE), .SDcols=colsToSum]
setnames(dt2, summedNms)

如果您想要将列追加到原始,则为

代码语言:javascript
复制
dt1[, c(summedNms) := lapply(.SD, sum, na.rm=TRUE), .SDcols=colsToSum]

就一般的na.rm流程而言,没有特定于data.table的流程,但可以看看?na.omit?na.exclude

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

https://stackoverflow.com/questions/18961049

复制
相关文章

相似问题

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