在R`data.table`中使用命名列表和`设置多列:=`
使用在R`data.table`中使用命名列表和`设置多列:=`,r,data.table,R,Data.table,使用:=创建新列是我最喜欢的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
:=
创建新列是我最喜欢的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
这两种方法都需要提前输入新列的名称。您可以手动输入它们,也可以在创建列之前将它们保存在对象中,或者在:=
的左侧有一个生成名称的函数。我不知道的是如何在一次调用中获得名称和输出到:=
有办法做到这一点吗?下面是我希望做的一个例子:
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.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))
不起作用。注释太长。不漂亮:
dt[, {
a <- my_fun(widths, heights)
for (x in names(a))
set(dt, j=x, value=a[[x]])
}]
dt[,{
adt[,c(mget(name(.SD)),my_-fun(widts,heights))]
,或者可能是cbind(dt,dt[,my_-fun(widts,heights)]
,但它们都没有在原地做任何事情谢谢。mget()选项很好,但我要寻找的关键是使用:=
或set()进行原地更新我想,dt[,do.call(“:=”,我的乐趣(宽度,高度))]
理论上完全可以满足您的需求,但目前还不起作用。我已经提交了一个问题,感谢您提交该问题。内置的东西会非常好,因为在这种情况下可以使用和所有其他data.table工具。谢谢,但这不是我想要的。我想保留data.table类并在不复制dt
的情况下添加新列。感谢此解决方案。我接受它,因为它符合我的要求。如果您对如何在使用by=
分组时轻松扩展此功能有任何想法,那就太好了。也许可以添加by参数和I with.I
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
dt[, {
a <- my_fun(widths, heights)
for (x in names(a))
set(dt, j=x, value=a[[x]])
}]