首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用R datable的.SDcols风格使用可积数据更新或添加多个列

使用R datable的.SDcols风格使用可积数据更新或添加多个列
EN

Stack Overflow用户
提问于 2020-07-18 23:57:31
回答 1查看 137关注 0票数 4

考虑到虹膜数据,我想添加与找到的所有数值列相对应的新列。我可以显式列出每个数字列:

代码语言:javascript
复制
from datatable import fread, f, mean, update
iris_dt = fread("https://h2o-public-test-data.s3.amazonaws.com/smalldata/iris/iris.csv")
iris_dt[:, update(C0_dist_from_mean = dt.abs(f.C0 - mean(f.C0)),
                  C1_dist_from_mean = dt.abs(f.C1 - mean(f.C1)),
                  C2_dist_from_mean = dt.abs(f.C2 - mean(f.C2)),
                  C3_dist_from_mean = dt.abs(f.C3 - mean(f.C1)))]

但那样的话我会用硬编码的列名。使用.SDcols的R数据表提供了更健壮的方法

代码语言:javascript
复制
library(data.table)
iris = fread("https://h2o-public-test-data.s3.amazonaws.com/smalldata/iris/iris.csv")
cols = names(sapply(iris, class)[sapply(iris, class)=='numeric'])
iris[, paste0(cols,"_dist_from_mean") := lapply(.SD, function(x) {abs(x-mean(x))}),
     .SDcols=cols]

今天是否有类似的方法来处理可化热的问题?

我确实知道如何获取py-datatable中的所有数字列,例如:

代码语言:javascript
复制
iris_dt[:, f[float]]

但在R中使用.SDcols的最后一部分回避了我。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-19 01:50:15

创建对新列名和f表达式的dict理解,然后将其解压缩到update方法中:

代码语言:javascript
复制
from datatable import f, update, abs, mean

aggs = {f"{col}_dist_from_mean" : abs(f[col] - mean(f[col])) 
        for col in iris_dt[:, f[float]].names}

iris_dt[:, update(**aggs)]

更新

使用v1.1中的Type属性,这是另一种方法:

代码语言:javascript
复制
aggs = {f"{col}_dist_from_mean" : dt.math.abs(f[col] - f[col].mean()) 
        for col, col_type 
        in zip(iris_dt.names, iris_dt.types) 
        if col_type.is_float}

您还可以分块步骤:

创建一个具有计算值的框架:

代码语言:javascript
复制
expression = f[float]-f[float].mean()
expression = dt.math.abs(expression)

compute = iris_dt[:, expression]

compute重命名列标签

代码语言:javascript
复制
compute.names = [f"{name}_dist_from_mean" for name in compute.names]

iris_dt更新compute (请注意,您也可以使用cbind):

代码语言:javascript
复制
iris_dt[:, update(**compute)]
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62974899

复制
相关文章

相似问题

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