R添加和修改列

示例

DT[where, select|update|do, by] 语法用于处理data.table的列。

  • “ where”部分是i参数

  • “ select | update | do”部分是自j变量

这两个参数通常按位置而不是按名称传递。

我们下面的示例数据是

mtcars = data.table(mtcars,keep.rownames= TRUE)

编辑整个列

在:=内部使用运算符j分配新列:

mtcars[, mpg_sq := mpg^2]

通过设置为来删除列NULL:

mtcars[, mpg_sq := NULL]

使用:=运算符的多元格式添加多列:

mtcars[, `:=`(mpg_sq = mpg^2, wt_sqrt = sqrt(wt))]
# or 
mtcars[, c("mpg_sq", "wt_sqrt") := .(mpg^2, sqrt(wt))]

如果列是从属的并且必须按顺序定义,则一种方法是:

mtcars[, c("mpg_sq", "mpg2_hp") := .(temp1 <- mpg^2, temp1/hp)]

.()当的右侧LHS := RHS是一列列表时使用该语法。

对于动态确定的列名,请使用括号:

vn = "mpg_sq"
mtcars[, (vn) := mpg^2]

列也可以使用进行修改set,但这很少需要:

set(mtcars, j = "hp_over_wt", v = mtcars$hp/mtcars$wt)

编辑列的子集

使用i参数将子集添加到应进行“位置”编辑的行:

mtcars[1:3, newvar := "Hello"]
# or
set(mtcars, j = "newvar", i = 1:3, v = "Hello")

就像在data.frame中一样,我们可以使用行号或逻辑测试进行子集化。也可以在中使用“ join” i,但是在另一个示例中将介绍更复杂的任务。

编辑列属性

编辑属性的函数(例如levels<-或names<-)实际上是用修改后的副本替换对象。即使仅在data.table中的一列上使用,也将复制并替换整个对象。

要修改对象没有副本,使用setnames改变的列名data.table或data.frame和setattr更改任何对象的属性。

# Print a message to the console whenever thedata.tableis copied
tracemem(mtcars)
mtcars[, cyl2 := factor(cyl)]

# Neither of these statements copy the data.table
setnames(mtcars, old = "cyl2", new = "cyl_fac")
setattr(mtcars$cyl_fac, "levels", c("four", "six", "eight"))

# Each of these statements copies the data.table
names(mtcars)[names(mtcars) == "cyl_fac"] <- "cf"
levels(mtcars$cf) <- c("IV", "VI", "VIII")

请注意,这些更改是通过引用进行的,因此它们是全局的。在一个环境中更改它们会影响所有环境中的对象。

# This function also changes the levels in the global environment
edit_levels <- function(x) setattr(x, "levels", c("low", "med", "high"))
edit_levels(mtcars$cyl_factor)