Я не думаю, что есть способ на самом деле использовать и summarise
, и summarise_at
, поскольку ясно, что мы не сможем выполнить второй после потери множества строк и столбцов.
Таким образом, вместо этого мы можем использовать mutate
, mutate_at
, а затем отбрасывать определенные строки (и, возможно, столбцы). Разница между этим и каким-то магическим применением summarise
и summarise_at
заключается в том, что первый подход не будет сбрасывать какие-либо переменные. Я думаю, это зависит от того, хорошо ли это для вас. Ниже я добавляю дополнительную строку select(-one_of(setdiff(names(zed), "team")))
, которая на самом деле удалит все столбцы, которые будут отбрасываться суммирующим списком.
zed$zonenumber2 <- zed$zonenumber # Example
zed %>%
group_by(team) %>%
mutate(
shotsMade = sum(result == "twopointmade"),
shotsAtt = n(),
shotsPct = round(shotsMade / shotsAtt),
points = 2 * shotsMade) %>%
mutate_at(
vars(contains("zone")),
.funs = funs(Made1 = sum(. == 1), Made2 = sum(. == 2),
Made3 = sum(. == 3), Made4 = sum(. == 4))) %>%
filter(!duplicated(team)) %>%
select(-one_of(setdiff(names(zed), "team"))) # May want to remove
# A tibble: 2 x 13
# Groups: team [2]
# team shotsMade shotsAtt shotsPct points zonenumber_Made1 zonenumber2_Mad… zonenumber_Made2
# <chr> <int> <int> <dbl> <dbl> <int> <int> <int>
# 1 Bos 7 10 1 14 4 4 3
# 2 Min 4 10 0 8 2 2 2
# … with 5 more variables: zonenumber2_Made2 <int>, zonenumber_Made3 <int>,
# zonenumber2_Made3 <int>, zonenumber_Made4 <int>, zonenumber2_Made4 <int>
Это зависит от того, что Вы пытаетесь сделать...
@@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ
Возвращают последнее значение ИДЕНТИФИКАЦИОННЫХ ДАННЫХ, произведенное на соединении, независимо от таблицы, которая произвела значение, и независимо от объема оператора, который произвел значение. @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ возвратят последнее значение идентификационных данных, ввел в таблицу на Вашей текущей сессии. @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ ограничены текущей сессией и не ограничены текущей областью. Например, если у Вас будет триггер на таблице, которая заставляет идентификационные данные быть созданными в другой таблице, то Вы получите идентификационные данные, которые были созданы в последний раз, даже если это был триггер, который создал его.
SCOPE_IDENTITY ()
Возвращает последнее значение ИДЕНТИФИКАЦИОННЫХ ДАННЫХ, произведенное на соединении и оператором в том же объеме, независимо от таблицы, которая произвела значение. SCOPE_IDENTITY () подобен @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ, но это также ограничит значение Вашей текущей областью. Другими словами, это возвратит последнюю стоимость идентификационных данных, которую Вы явно создали, а не любые идентификационные данные, которые были созданы триггером или определяемой пользователем функцией.
IDENT_CURRENT ()
Возвращает последнее значение ИДЕНТИФИКАЦИОННЫХ ДАННЫХ, произведенное в таблице, независимо от соединения и объема оператора, который произвел значение. IDENT_CURRENT ограничен указанной таблицей, но не соединением или объемом.
@@ Идентификационные данные являются старым школьным путем. Используйте SCOPE_IDENTITY () во всем продвижении экземпляров. См. MSDN для последствий использования @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ (они плохи!).
Существует другой метод, доступный в SQL Server 2005, который обрисован в общих чертах в SQL в Дикой природе .
Это позволит Вам получать несколько идентификационных данных после того, как вставят. Вот код от сообщения в блоге:
Create Table #Testing (
id int identity,
somedate datetime default getdate()
)
insert into #Testing
output inserted.*
default values
Маленькое исправление к ответу Godeke:
Это не просто триггеры, о которых необходимо волноваться. Любой вид вложенной операции, такой, как сохранено procs, который заставляет идентификаторы быть созданными, мог изменить значение @@ ИДЕНТИФИКАЦИОННЫЕ ДАННЫЕ.
Другое голосование за scope_identity...
SCOPE_IDENTITY достаточен для единственных строк и рекомендуется кроме случаев, где необходимо видеть результат промежуточного ТРИГГЕРА по некоторым причинам (почему?).
Для нескольких строк, которые ПРОИЗВОДЯТ/ПРОИЗВОДЯТ В, Ваш новый лучший друг и альтернатива перенахождению строк и вставке в другую таблицу.
Обратите внимание, что есть ошибка в scope_identity ()
и @@ identity
- см. MS Connect: https: // connect. microsoft.com/SQLServer/feedback/ViewFeedback.aspx?FeedbackID=328811
Цитата (от Microsoft):
Я настоятельно рекомендую использовать
OUTPUT
вместо@@ IDENTITY
в любом случае. Это просто лучший способ прочитать личность и временную метку.
Отредактировано для добавления: теперь это может быть исправлено. Connect выдает ошибку, но см.:
Scope_Identity (), возвращающий неверное значение, исправлено?
Будьте осторожны при использовании @@ IDENTITY ...
http://dotnetgalactics.wordpress.com/2009/10/28/scope-identity-vs-identity/