我正在尝试按数值对数据表进行子集,因此我只能对数字变量执行五个数字汇总。但是,我还需要对变量进行分组。我尝试这样做的方式不允许我使用不属于子集的子集和id变量。我知道数据表有.SD
命令,但我似乎无法在数据表中得到应用函数和组的正确组合。 id
变量不是数字,不能强制为数字;它在我的数据表中也不是唯一的。
以下是我的尝试:
library(data.table)
library(magrittr)
dt <- data.table(num1 = rep(1, 10),
num2 = rep(2, 10),
num3 = rep(100, 10),
id = c("1a", "2b", "2h", "3b", "4b", "5b", "5b", "7n", "8mn", "9y"),
char1 = rep("a", 10),
char2 = rep("b", 10))
numeric_variables <-
lapply(dt, is.numeric) %>%
unlist() %>%
as.vector()
dt[, numeric_variables, with = FALSE]
dt_summary <-
apply(dt[, numeric_variables, with = FALSE][, grep("num",
names(dt[, numeric_variables, with = FALSE]),
value = TRUE),
with = FALSE],
2,
fivenum) %>%
as.data.frame()
rownames(dt_summary) <-
c("Min", "Q1", "Med", "Q3", "Max")
dt_summary
dt[, .(numeric_variables, id), with = FALSE]
最后一行不起作用,因为id
不在我创建的numeric_variables类别中。如果有人可以指示我使用正确的by
,tapply
函数和.SD
我会很感激。
注意:这是较大程序的一部分,用户可以选择一个id
一次查看或比较两个id
变量。因此,它需要为一个或多个组(最终)工作。
答案 0 :(得分:3)
我猜您正在寻找.SDcols
ind <- sapply(dt, is.numeric)
(dt_summary <- dt[,lapply(.SD, fivenum), .SDcols = ind])
哪个给你
num1 num2 num3
1: 1 2 100
2: 1 2 100
3: 1 2 100
4: 1 2 100
5: 1 2 100
由于data.table
不接受您可以执行的rownames:
setDF(dt_summary)
rownames(dt_summary) <-
c("Min", "Q1", "Med", "Q3", "Max")
> dt_summary
num1 num2 num3
Min 1 2 100
Q1 1 2 100
Med 1 2 100
Q3 1 2 100
Max 1 2 100