gpt4 book ai didi

r - 将单列传递给 j 和从 data.table 中选择同一列有什么区别?

转载 作者:行者123 更新时间:2023-12-04 12:08:30 27 4
gpt4 key购买 nike

我有一个包含 name 的 data.table和 class .每个name属于一个 class .这是一个示例数据集。

library(data.table)
DT <- data.table(name = c("John","Smith","Jane","Ruby","Emerald","Jasmine","Tulip"),
class = c(1,2,3))

我想创建一个列,其中包含一个人所属类(class)中的所有学生。这就是我正在做的事情并且它有效。
DT[, class.students := paste(.SD), .SDcols = "name", by = "class"]

我试图理解为什么以下不起作用,即它不会在所有 name 的列表上评估该函数位于组中(它只返回创建列中行的 name 值)
DT[, class.students := paste(name), by = "class"]

特别是当下面的代码带有 max 时按预期工作,即它评估组中的所有元素并为每个组返回相同的值。
DT[, class.students := max(name), by = "class"]

我在这里缺少什么?

编辑: max是一个不好的例子,因为它在第一种方式中不起作用,使用 .SDcols ,但我希望我想表达的意思是清楚的。

最佳答案

.SDlist ,因此它返回一个可能不需要的输出(如果我们检查 str )。作为一个小例子

paste(list(letters[1:3])) #not the desirable output
#[1] "c(\"a\", \"b\", \"c\")"

paste(letters[1:3]) #did not change anything
#[1] "a" "b" "c"

然而, paste还有 sepcollapse作为参数
paste(letters[1:3], collapse=", ")
#[1] "a, b, c"

使用 OP 的示例,
DT[, class.students := paste(name, collapse=", "), by = class]

我们建议将函数直接应用于 .SD ,但如果只有一列,我们可以转换 listvector要么来自 [[或使用 unlist 进行转换等等。
DT[,  class.students := paste(unlist(.SD), collapse=", "), by = class]

或者
DT[, class.students := paste(.SD[[1]], collapse=", "), by = class]

如果我们检查 str(DT)综上所述,这将是相同的

关于在 .SD 上应用函数的最佳方式- 正如我们已经提到的,它是一个 list .和 .SD当列数较多时很有用。如 data.frame ,当有多个列时,我们用 lapply 遍历列然后继续
DT[, class.students := lapply(.SD, paste, collapse=", "), by = class]

我们也可以指定 .SDcols如果只使用了列的子集。这里,在这个例子中,只有两列,所以 .SDcols不需要。
str(DT)
#Classes ‘data.table’ and 'data.frame': 7 obs. of 3 variables:
# $ name : chr "John" "Smith" "Jane" "Ruby" ...
# $ class : num 1 2 3 1 2 3 1
# $ class.students: chr "John, Ruby, Tulip" "Smith, Emerald" "Jane, Jasmine" "John, Ruby, Tulip" ...
# - attr(*, ".internal.selfref")=<externalptr>

关于r - 将单列传递给 j 和从 data.table 中选择同一列有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42048286/

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