data.table包语法:括号,.SD和.SDcols

时间:2018-08-30 16:22:23

标签: r syntax data.table

我是R新手,我想了解这行的语法。我了解它在做什么,但我不明白它是如何表达的:

plms[, (cols) := lapply(.SD, str_trim), .SDcols = cols]

plms是一个数据表。 colsplms中所有字符列名称的列表。此行将str_trim应用于plms中的所有字符列。但是,我不明白:

1)为什么(cols)放在方括号中。

2).SD.SDcols的含义。脚本中尚未使用.SD.SDcols -在此首先提到它们。点首的意义是什么?

我还不确定:=运算符-我认为它对data.tables具有扩展的含义。

谢谢!

1 个答案:

答案 0 :(得分:0)

1)R中的()是一个函数,可以被覆盖,即,您可以为其分配不同的行为。您可能会注意到,当您执行(a <- 1)时,控制台正在打印1,即可以重做此行为。在data.table和您的示例中,请参见下文。

首先,我们准备plms数据表:

set.seed(123)
plms <- data.table(
  a = sample(c("A", "B ", "C ", " D "), 5, replace = TRUE),
  b = sample(c("A", "B  ", "C ", " D "), 5, replace = TRUE),
  c = sample(c("A", "B ", "C ", " D "), 5, replace = TRUE)
)
cols <- c("a", "b", "c")
plms
#     a   b   c
# 1:  B    A  D 
# 2:  D   C   B 
# 3:  B   D   C 
# 4:  D   C   C 
# 5:  D  B     A

您可以看到带有尾随空格的数据表。然后应用您的代码:

plms[, (cols) := lapply(.SD, str_trim), .SDcols = cols]
plms
# a b c
# 1: B A D
# 2: D C B
# 3: B D C
# 4: D C C
# 5: D B A

已删除尾随空间-确定。这意味着data.table的{​​{1}}功能得到了重新定义-它从()向量中获取列名,并将按列cols的结果分配给这些列。

现在没有括号:

strtrim

实际上,这意味着您创建了列plms[, cols := lapply(.SD, str_trim), .SDcols = cols] plms # a b c cols # 1: B A D B,D,B,D,D # 2: D C B A,C,D,C,B # 3: B D C D,B,C,C,A # 4: D C C B,D,B,D,D # 5: D B A A,C,D,C,B 并为此列分配了cols

2)list-是内部只读符号(实际上是.SD对象)

  

.SD是一个data.table,其中包含每个组x的数据子集,不包括by(或keyby)中使用的任何列。

您可以输入以下数据:

data.table

如您所见,将plms[, lapply(.SD, print), .SDcols = cols] # [1] "B " " D " "B " " D " " D " # [1] "A" "C " " D " "C " "B " # [1] " D " "B " "C " "C " "A" # a b c # 1: B A D # 2: D C B # 3: B D C # 4: D C C # 5: D B A 逐列应用于print的结果显示了.SD所选择的列。

SDcols也被重新定义,该函数的参数之一是[],用于选择.SDcols数据表的列。请参阅下面的文档。

  

.SDcols指定要包含在特殊行中的x的列   符号.SD代表data.table的子集。可能是性格   列名或数字位置。这对于提高速度时很有用   通过(可能有很多)列的子集应用函数;   例如DT [,lapply(.SD,sum),by =“ x,y”,。SDcols = 301:350]。

3).SD也是一个函数(您可以使用:=来获得帮助。此函数的主要思想是在对象内部修改数据(通过引用):

?":="

通常,R通过值起作用,并且在函数执行期间不修改对象(函数方法:函数在执行期间不应更改参数)。

从根本上来说,这是plms[, a := "x"] plms # a b c # 1: x A C # 2: x D B # 3: x A B # 4: x B D # 5: x C B 包的一个有争议的观点,因为对象内部状态的更改可能导致几乎无法识别错误和调试困难,但是与例如相比,它提供了更高的速度和处理所需的较小内存。 data.table