【问题标题】:Using R data.table to transform categorical columns by using the mean of a numeric column使用 R data.table 通过使用数值列的平均值来转换分类列
【发布时间】:2021-03-03 00:11:22
【问题描述】:

我正在尝试使用 r data.table 来执行以下计算:

我有一个包含分类列和一个数字列的表格,例如

           cat1         cat2         cat3      target       
0           x            xy          xxx          1      
1           x            xx          xxx          1
2           x            xx          yyy          0
3           y            yx          yyy          1
4           y            yy          yyy          0
5           y            yy          yyy          1

我想计算一个形状相同的表格,其中每个分类变量的级别已更改为该级别的目标列的平均值。

即上述 data.table 的结果将是

           cat1         cat2         cat3      target       
0          0.66         1            1          1      
1          0.66         0.5          1          1
2          0.66         0.5          0.5        0
3          0.66         1            0.5        1
4          0.66         0.5          0.5        0
5          0.66         0.5          0.5        1

请不要使用常规 r 数据帧的解决方案,只有 data.table,因为我这样做是为了更好地使用 data.tables,谢谢!!

【问题讨论】:

  • "我这样做是为了练习" - 但您希望 我们 为您提供整个解决方案吗? ;)
  • 哈哈公平点@Henrik。我的意思是我可以通过调用dt[,mean(target),by=catx] 在for 循环中执行此操作,并将每个变量的结果合并回这个data.table。只是想知道那里的 data.table 向导是否有更优雅的解决方案。

标签: r data.table


【解决方案1】:

这是一种方法:

library(data.table)
vars <- names(dt)[names(dt)!='target']
setDT(dt)
dt[, (vars) := lapply(.SD, function(x) ave(target, x)), .SDcols = vars]

#    cat1 cat2 cat3 target
#1: 0.667  1.0  1.0      1
#2: 0.667  0.5  1.0      1
#3: 0.667  0.5  0.5      0
#4: 0.667  1.0  0.5      1
#5: 0.667  0.5  0.5      0
#6: 0.667  0.5  0.5      1

注意ave 中的默认函数是mean,我在这里没有明确应用。

【讨论】:

    【解决方案2】:

    目前我必须依赖 for 循环的解决方案,但我想它没问题..

    vars_to_change <- names(dt)[names(dt)!='target']
    for (v in vars_to_change) {
     d_sub<-dt[,mean(target),by=v]
     setnames(d_sub,'V1',paste0(v,'_num'))
    
     dt <- merge(dt,d_sub,by=v)
    }
    
    dt=dt[,-..vars_to_change]
    

    【讨论】:

      猜你喜欢
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-05
      • 2021-11-30
      • 2016-03-11
      • 2014-08-09
      • 1970-01-01
      相关资源
      最近更新 更多