gpt4 book ai didi

r - 使用命名列表和 `data.table` 在 R `:=` 中设置多列

转载 作者:行者123 更新时间:2023-12-04 13:28:02 25 4
gpt4 key购买 nike

使用 :=创建新列是我最喜欢的 data.table 功能之一。我知道使用它一次添加多个列的两种方法。这是一个简单的例子

dt <- data.table("widths" = seq(2, 10, 2), "heights" = 8:4)
dt
widths heights
1: 2 8
2: 4 7
3: 6 6
4: 8 5
5: 10 4
假设我想添加两列,一列用于面积,另一列用于周长。第一种方法是调用,例如
new_cols <- c("areas", "perimeters")

my_fun <- function(x, y){
areas <- x * y
perimeters <- 2*(x + y)
return(list(areas = areas, perimeters = perimeters))
}

dt[ , (new_cols) := my_fun(widths, heights)]
dt
widths heights areas perimeters
1: 2 8 16 20
2: 4 7 28 22
3: 6 6 36 24
4: 8 5 40 26
5: 10 4 40 28
等效地,我们可以使用 := 的函数形式如下:
dt[ , `:=`("areas" = widths * heights, "perimeters" = 2*(widths + heights))]
这两种方法都需要提前输入新列的名称。您可以手动输入它们,也可以在创建列之前将它们保存在一个对象中,或者您可以在 := 的左侧使用一个函数。产生名字。我不知道的是一种将名称和输出都获取到 := 的方法。在一次通话中。
有没有办法做到这一点?这是我希望做的一个例子:
dt[ , (new_cols) := NULL] # delete the previously added area and perimeter cols.
dt[ , `:=`(my_fun(widths, heights))]
dt
widths heights areas perimeters
1: 2 8 16 20
2: 4 7 28 22
3: 6 6 36 24
4: 8 5 40 26
5: 10 4 40 28
理想情况下,有一种方法可以使 :=看到 my_fun()返回名称,然后将它们用作新列的名称。我知道上面会产生错误,但我想知道是否有一种简单的方法可以获得所需的功能,因为这在有很多列或列名取决于函数输入的更大问题中很有用。
编辑:
我正在寻找的关键是一种通过引用分配这些列的方法,即使用 :=或 set(),我还想将输出的类保持为 data.table .

最佳答案

评论太长了。不漂亮:

dt[, {
a <- my_fun(widths, heights)
for (x in names(a))
set(dt, j=x, value=a[[x]])
}]
或者您可以通过 dt如果它是由您创建的,则进入该功能?

关于r - 使用命名列表和 `data.table` 在 R `:=` 中设置多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66917673/

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