#r
#r
Вопрос:
dput(x)
structure(list(State = structure(c(1L, 1L, 2L, 3L, 2L, 4L, 2L,
5L, 5L, 2L), .Label = c("Illinois", "Texas", "California", "Louisiana",
"Michigan"), class = "factor"), Lat = structure(1:10, .Label = c("41.627",
"41.85", "32.9588", "33.767", "33.0856", "30.4298", "29.7633",
"42.4687", "43.0841", "29.6919"), class = "factor"),
Long = structure(1:10, .Label = c("-88.204",
"-87.65", "-96.9812", "-118.1892", "-96.6115", "-90.8999", "-95.3633",
"-83.5235", "-82.4905", "-95.6512"), class = "factor")), .Names = c("State",
"Lat", "Long"), row.names = c(NA, 10L), class = "data.frame")
Мне нужно иметь еще один столбец с надписью total, который будет общим количеством каждого состояния. Я могу сделать это, создав еще один столбец Total:
x$Total<-1
затем
library(data.table
x<-data.table(x)
x<-x[,total:=sum(Total),by=State]
Есть ли лучший / более короткий / эффективный способ подсчета факторов в фрейме данных?
Комментарии:
1. Вы пробовали
x<-x[,total:=.N,by=State]
? (Нет необходимости сначала инициализироватьTotal
)2.
tabulate(x$State)[x$State]
выглядит тоже корректно
Ответ №1:
Вы можете использовать dplyr
так (без необходимости создания Total
столбца):
(Редактировать: благодаря @beginneR, просветившему меня о существовании n()
, это может быть еще более кратким)
library('dplyr')
mutate(group_by(x, State), total = n())
решение для начинающих group_by(x, State) %>% mutate(total = n())
также хорошо, особенно если вам нужно будет продолжить другие манипуляции с вашими данными. Аналогично,
x %>%
group_by(State) %>%
mutate(total = n())
тоже будет работать.
Комментарии:
1. Я бы предложил переписать это на:
group_by(x, State) %>% mutate(total = n())
. (Обратите внимание, что вы получите столбец с именемsum(length(State))
в вашем примере). Кстати,dplyr
также принимаетdata.table
s для работы.2. Я отредактировал свой ответ, чтобы назвать новый столбец
total
. Но мне больше нравится решение @Beginner’s. Я не знал обn()
этом, это действительно удобно!3. @KaraWoo не стесняйтесь редактировать свой вопрос с
n()
помощью .
Ответ №2:
Вы также можете использовать R base aggregate
> aggregate(.~State, FUN=length, data=x)