繁体   English   中英

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

[英]set multiple columns in R `data.table` with a named list and `:=`

使用:=创建新列是我最喜欢的 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))]

这两种方法都需要提前输入新列的名称。 您可以手动输入它们,您可以在创建列之前将它们保存在 object 中,或者您可以在:=的左侧有一个 function 来生成名称。 我不知道的是一种在一次调用中同时获取名称和 output 到:=的方法。

有没有办法做到这一点? 这是我希望做的一个例子:

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()返回名称,然后将这些名称用作新列的名称。 我知道上面会产生一个错误,但我想知道是否有一种简单的方法可以获得所需的功能,因为这在有很多列或列名取决于 function 的输入的较大问题中很有用。

编辑:我正在寻找的关键是通过引用分配这些列的方法,即使用:=或 set(),并且我还想将 output 的 class 维护为data.table

评论太长了。 不漂亮:

dt[, {
    a <- my_fun(widths, heights)   
    for (x in names(a))
        set(dt, j=x, value=a[[x]])
}]

或者,如果它是由您创建的,您可以将dt传递给 function?

我不认为你在寻找这个,但这很有效。

data.frame(dt, my_fun(dt$widths, dt$heights))

#  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

不幸的是, data.table(dt, my_fun(dt$widths, dt$heights))不起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM