gpt4 book ai didi

r - 在data.table中,使用.SD时在j中取点(.)和 'c'有什么区别?它是如何工作的?

转载 作者:行者123 更新时间:2023-12-02 00:57:31 25 4
gpt4 key购买 nike

以DT为mtcars数据表。

DT <- as.data.table(mtcars) 

当使用 .SD 在 'j' 中获取多个参数时,如果我们像下面的代码一样在 j 之前使用点 (.)

DT[ , .(lapply(.SD, sum), .N), by = (cyl) ]

结果按垂直顺序排列,不带列名。

O/P:

cyl V1 N

1: 6 138.2 7

2: 6 1283.2 7

3: 6 856 7

4: 6 25.1 7

5: 6 21.82 7

6: 6 125.84 7

7: 6 4 7

8: 6 3 7

但是当我用'j'和'c'中的点(.)替换它时,如下所示,

DT[ , c(lapply(.SD, sum), .N), by = (cyl) ]

结果按水平顺序出现。

O/P:

cyl mpg disp hp drat wt qsec vs am gear carb N

6 138.2 1283.2 856 25.10 21.820 125.84 4 3 27 24 7

4 293.3 1156.5 909 44.78 25.143 210.51 10 8 45 17 11

8 211.4 4943.4 2929 45.21 55.989 234.81 0 2 46 49 14

在另一种情况下,如果没有 lapply,则会发生完全相反的情况。

DT[ , c(sum(mpg), .N), by = (cyl) ]

垂直输出

O/P:

cyl V1

1: 6 138.2

2: 6 7.0

3: 4 293.3

4: 4 11.0

5: 8 211.4

6: 8 14.0

而 'j' 中的点 (.) 给出水平输出。

DT[ , .(sum(mpg), .N), by = (cyl) ]

O/P:

cyl V1 N

1: 6 138.2 7

2: 4 293.3 11

3: 8 211.4 14

为什么会这样?为什么结果是这样排序的?

最佳答案

DT[,    .(sum(mpg), .N), by = (cyl) ] # equal, creates a list with 2 elements (2 columns)
DT[, list(sum(mpg), .N), by = (cyl) ] # equal, to above

DT[, c(sum(mpg), .N), by = (cyl) ] # creates a vector of length 2 (equal to 2 rows)

另一个简化的例子。

DT[ ,    .(col1 = 1, col2 = 2), by = (cyl) ]
DT[ , list(col1 = 1, col2 = 2), by = (cyl) ]

DT[ , c(element1 = 1, element2 = 2), by = (cyl) ]

为了解决你的最后一点,

DT[ , c(element1 = 1, element2 = 2, element3 = list(3)), by = (cyl) ]
DT[ , c(element1 = 1, element2 = 2, element3 = 3 ), by = (cyl) ]

您需要了解有关c 函数的更多信息。

因此,当 lapply (listapply) 返回一个列表时,c 会将 .N 作为新的 LIST ELEMENT 添加到 c( lapply(.SD, sum), .N).

所以你最终得到 n 个列表元素,因此有 n 个列。


只是为了好玩:

DT[ , c(lapply(.SD, sum), .N), by = (cyl) ]
DT[ , c(sapply(.SD, sum), .N), by = (cyl) ] # sapply will simplify the result into a vector, therefore c() will combine into a vector and you end up with many rows.

关于r - 在data.table中,使用.SD时在j中取点(.)和 'c'有什么区别?它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53224462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com