Construct данные:
dat <- data.frame(Subject = rep(1:3, each=3),
Nationality = rep(c("G","D","S"), each=3))
Попробуйте это:
with(dat,table(tapply(as.character(Nationality),
list(Subject),head,n=1)))
## D G S
## 1 1 1
with()
выглядит в контексте фрейма данных, чтобы не вводить dat$
все время
tapply()
запускает указанный функция (head
) на каждый элемент вектора ()), разделенные группами (list(Subject)
), с необязательными параметрами (n=1
занимает только первый элемент).
as.character()
является уродливым, но не позволяет R преобразовывать коэффициент в числовые коды.
table
вычисляет таблицу.
Вы также можете попробовать это: скорость
library("dplyr")
d2 <- dat %>% group_by(Subject) %>%
summarise(Nationality=head(Nationality,1))
table(d2$Nationality)
Тест:
n <- 351078 ## divisible by 3, for convenience
set.seed(101)
nat <- sample(c("G","D","S"),size=n/3,replace=TRUE)
dat <- data.frame(Subject = rep(1:(n/3),each=3),
Nationality = rep(nat,each=3))
system.time(tab <- with(dat,table(tapply(as.character(Nationality),
list(Subject),head,n=1))))
Это занимает около 1,9 секунды на моей машине ...
С другой стороны
system.time(tab2 <- with(dat,table(Nationality[!duplicated(Subject)])))
занимает около 0,02 (!) Секунд ...
Pssst! Существует сайт http://datascience.stackexchange.com/, посвященный науке о данных. Может быть, вам лучше помочь там ... Что касается форматирования столбцов таблицы, люди обычно используют блоки кода (в редакторе post используйте кнопку '{}' или CTRL + K над выбранным текстом). – TLama
уточните, что вы подразумеваете под «выбрать национальность каждого субъекта один раз». какой результат вы хотите посмотреть? –
Спасибо. Я буду помнить об этом в следующий раз :). Данные, используемые, чтобы посмотреть, как это после того, как таблицы (Дат $ национальности) (я просто использовать «данные» выше для иллюстрации) G 3 D 2 S 4 Но я хочу, чтобы это было : G 1 D 2 S 3 , поскольку существует только один G человек, один D человек, один S человек – Braino