不等大小的data.table上的操作(+, - ,/,*)

时间:2014-07-24 17:29:12

标签: r data.table

1)是否可以使用data.table在不等大小的data.tables之间进行操作(乘法,除法,加法,减法),还是必须用data.frame完成?

以下示例是我原始发布的简化版本。在我的实际数据集中,它将是A1:A12,B1:B12,C1:C12,E1:E12,F1:F12等。我已在J和K列中添加以接近我的原始数据集并且表明我不能在矩阵中执行以下操作。

# Sample Data
library(data.table)
input1a <- data.table(ID = c(37, 45, 900), 
              A1 = c(1, 2, 3), 
              A2 = c(43, 320, 390), 
              B1 = c(-0.94, 2.2, -1.223), 
              B2 = c(2.32, 4.54, 7.21), 
              C1 = c(1, 2, 3), 
              C2 = c(-0.94, 2.2, -1.223), 
              D = c(43, 320, 390), 
              J = paste0("measurement_1", 1:3), 
              K = paste0("type_1", 1:3))
setkey(input1a, ID)
input1a
#      ID  A1  A2     B1   B2  C1     C2   D              J       K
#  1:  37   1  43 -0.940 2.32   1 -0.940  43 measurement_11 type_11
#  2:  45   2 320  2.200 4.54   2  2.200 320 measurement_12 type_12
#  3: 900   3 390 -1.223 7.21   3 -1.223 390 measurement_13 type_13

input2a <- data.table(ID = c(37, 45, 900), 
                      E1 = c(23, -0.2, 12), 
                      E2 = c(-0.33, -0.012, -1.342))
setkey(input2a, ID)
input2a
#     ID         E1     E2
# 1:  37 -0.6135756 -0.330
# 2:  45 -0.0124872 -0.012
# 3: 900 -0.4165049 -1.342

outputa <- 0.00066 * input1a[, c(4:5), with = FALSE] *   
input1a[, 8, with = FALSE] * input2a[, c(2:3), with = FALSE] # no keys, but would 
# like to keep the keys
# outputa <- 0.00066 * B1:B2 * D * A1:A2 / referring back to the column names
setnames(outputa, 2:3, c("F1", "F2"))

使用outputa

的结果
outputa # using existing code and gives a result with no keys
#            F1             F2
# 1: -0.6135756    -0.02172773
# 2: -0.0929280    -0.01150618
# 3: -3.7776024    -2.49055607

在下面的代码中,我使用 outputa ,但没有保留密钥,并将 outputa 重写为 outputause 。我想回答以下问题,以便我可以在保持密钥完整的同时对数据集执行所需的操作。

2)如何使用为每组列定义的 x 重写以下代码?这个问题源于Weighted sum of variables by groups with data.table,我试图用我的数据集复制任何答案。

每组列定义如下:

  • A1:A2(input1a[, 2:3]),
  • B1:B2(input1a[, 4:5])和
  • D input1a[, 8]

outputause 中,如果input1a[, c(4:5), with = FALSE]是来自 input1a 的唯一群组,那么单独就是 x

如果您有一个data.table组中的多个组,如下所示,该怎么办?

outputause <- input1a[, lapply(.SD, function(x) {
    0.00066 * input1a[, c(4:5), with = FALSE] * input1a[, 8, with = FALSE] * 
      input2a[, c(2, 3), with = FALSE]
  }), by = key(input1a)] # keeping keys intact
setnames(outputause, 2:3, c("F1", "F2"))

使用outputause的结果

outputause # using revised code and result includes the keys
#    ID             F1               F2
# 1: 37    -0.6135756       -0.02172773
# 2: 45    -0.0929280       -0.01150618
# 3: 900   -3.7776024       -2.49055607

更新

input2at <- data.table(t(input2a))
inputs <- data.table(input1a, input2at)

我已将input2a转置为input1a并将其与inputs合并到data.table {{1}}中。在这个简单的例子中,我有3行,但在我的实际数据集中,我将有近1300行。这就是为什么我问过问题2)。

谢谢。

1 个答案:

答案 0 :(得分:0)

我根据R data.table operations with multiple groups in single data.table and outside function with lapply中提供给我的答案回答了我自己的问题。

outputa <- data.table(input1a, input2a)
setnames(outputa, 8, "D1")
outputa[, D2 := D1]

fun <- function(B, D, E) 0.00066 * B * D * E

outputa[, lapply(1:2, function(i) fun(get(paste0('B', i)),
                                  get(paste0('D', i)),
                                  get(paste0('E', i)))),
      by = ID]