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
обновил функциональность ()
- он берет имена столбцов из вектора 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
и присвоили этому столбцу list
.
2) .SD
- это внутренний символ только для чтения (фактически data.table
объект)
.SD - это таблица данных, содержащая Подмножество данных x для каждой группы, исключая любые столбцы, используемые в (или keyby).
вы можете данные ниже:
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
, который используется для выбора столбцов для таблицы данных .SD
. Пожалуйста, смотрите ниже документацию.
.SDcols указывает столбцы x, которые будут включены в специальный
Символ .SD, который обозначает Подмножество data.table. Может быть персонажем
имена столбцов или числовые позиции. Это полезно для скорости, когда
применение функции через подмножество (возможно, очень много) столбцов;
например, DT [, lapply (.SD, sum), by = "x, y", .SDcols = 301: 350].
3) :=
также является функцией (вы можете увидеть справку по ней с ?":="
. Основная идея этой функции заключается в том, что данные изменяются внутри объекта (для справки):
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
Обычно R работает по значению, и при выполнении функции модификация объекта отсутствует (функциональный подход: функция не должна изменять аргумент во время выполнения).
По сути, это как-то спорный момент пакета data.table
, так как изменение внутреннего состояния объекта может привести к трудному выявлению ошибок и трудностей с отладкой, однако, обеспечивая превосходную скорость и меньшую память, необходимую для обработки, по сравнению, например, с. base::data.frame
.