【问题标题】:R Data.Table With WeightsR Data.Table 带权重
【发布时间】:2020-05-05 18:53:12
【问题描述】:
library(data.table)
data = data.table("STUDENT" = c(1:100),
                  "SAMPLEWEIGHT" = sample(12:99, r = T, 100),
"LABEL1" = sample(1:2, r = T, 100),
"LABEL3" = sample(1:3, r = T, 100),
"CAT"=sample(0:1,r = T, 100),
"FOX"=sample(0:1,r = T, 100),
"DOG"=sample(0:1,r = T, 100),
"MOUSE"=sample(0:1,r = T, 100),
"BIRD"=sample(0:1,r = T, 100))

dataWANT = data.frame("LABEL1" = c(1,1,1,2,2,2),
                                            "LABEL3" = c(1,2,3,1,2,3),
                                            "CAT_N" = NA,
                                            "CAT_PER" = NA,
                                            "FOX_N" = NA,
                                            "FOX_PER" = NA,
                                            "DOG_N" = NA,
                                            "DOG_PER" = NA,
                                            "MOUSE_N" = NA,
                                            "MOUSE_PER" = NA,
                                            "BIRD_N" = NA,
                                            "BIRD_PER" = NA)

我有一个名为 data.table 的 data.table,我正在尝试总结学生数据,就像 dataWANT 中显示的那样。

在 dataWANT 中,末尾有 _N 的列只是每个 LABEL1 和 LABEL3 组合等于 1 的列中值的计数,因此总共 6 个组。

在 dataWANT 中,末尾有 _PER 的列是其列中有 _PER 的组的加权比例。

【问题讨论】:

  • 你需要data[, c(setNames(lapply(.SD, sum), paste0(names(.SD), "_N")), setNames(lapply(.SD, function(x) weighted.mean(x == 1, SAMPLEWEIGHT)), paste0(names(.SD), "_PER"))),.(LABEL1, LABEL3), .SDcols = CAT:BIRD]

标签: r data.table summary


【解决方案1】:

使用data.table 的选项是按'LABEL1'、'LABEL3' 分组,在.SDcols 中指定感兴趣的列,通过循环.SD 获取sum(因为它是二进制列)并根据“SAMPLEWEIGHT”列与weighted.mean 连接

library(data.table)
data[, c(setNames(lapply(.SD, sum), paste0(names(.SD), "_N")), 
  setNames(lapply(.SD, function(x) weighted.mean(x == 1, SAMPLEWEIGHT)), 
     paste0(names(.SD), "_PER"))),.(LABEL1, LABEL3), .SDcols = CAT:BIRD]

【讨论】:

  • @akun 如果你有机会看到stackoverflow.com/questions/61611000/…
  • @bvowe 请检查 weightedd.mean 的值
  • 这将是 dplyr 等效项(这超出了问题的范围,但与 data.table 方法相比仍然很有趣):data %>% group_by(LABEL1, LABEL3) %>% summarise_at(vars(CAT:BIRD), list(N = ~ sum(.), PER = ~ weighted.mean(. == 1, SAMPLEWEIGHT)))
猜你喜欢
  • 2016-01-01
  • 2018-04-07
  • 2015-04-29
  • 2017-11-04
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
相关资源
最近更新 更多