как вы подсчитываете уникальные факторы и вставляете их в один и тот же фрейм данных в R

#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)