我是R新手,我想了解这行的语法。我了解它在做什么,但我不明白它是如何表达的:
plms[, (cols) := lapply(.SD, str_trim), .SDcols = cols]
plms
是一个数据表。 cols
是plms
中所有字符列名称的列表。此行将str_trim
应用于plms
中的所有字符列。但是,我不明白:
1)为什么(cols)
放在方括号中。
2).SD
和.SDcols
的含义。脚本中尚未使用.SD
和.SDcols
-在此首先提到它们。点首的意义是什么?
我还不确定:=
运算符-我认为它对data.tables具有扩展的含义。
谢谢!
答案 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
。