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 copiedtracemem(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 environmentedit_levels <- function(x) setattr(x, "levels", c("low", "med", "high"))
edit_levels(mtcars$cyl_factor)
以上是 R添加和修改列 的全部内容, 来源链接: utcz.com/z/321316.html