Синтаксис пакета data.table: круглые скобки, .SD и .SDcols - PullRequest
0 голосов
/ 30 августа 2018

Я новичок в R и пытаюсь понять синтаксис этой строки. Я понимаю, что он делает, но я не понимаю, как это выражается:

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

plms является таблицей данных. cols - это список имен всех символьных столбцов в plms. Эта строка применяется str_trim ко всем символьным столбцам в plms. Однако я не понимаю:

1) почему в скобках присутствует (cols).

2) что означают .SD и .SDcols. Ни .SD, ни .SDcols еще не использовались в сценарии - они оба упомянуты здесь первыми. Какое значение имеет точка, которая ставит перед ними префикс?

Я также немного не уверен в операторе := - насколько я понимаю, он имеет расширенное значение в data.tables.

Заранее спасибо!

1 Ответ

0 голосов
/ 24 сентября 2018

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.

...