使用位置和名称的数据表子集

时间:2015-12-23 16:41:52

标签: r data.table subset

我正在尝试按数值对数据表进行子集,因此我只能对数字变量执行五个数字汇总。但是,我还需要对变量进行分组。我尝试这样做的方式不允许我使用不属于子集的子集和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类别中。如果有人可以指示我使用正确的bytapply函数和.SD我会很感激。

注意:这是较大程序的一部分,用户可以选择一个id一次查看或比较两个id变量。因此,它需要为一个或多个组(最终)工作。

1 个答案:

答案 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