2015-01-03 6 views
0

У меня есть набор данных 351080 наблюдений, (транспонированная) выглядит следующим образом:Выберите первую новое значение в столбце

Subject  1 1 1 2 2 3 3 3 3 
nationality G G G D D S S S S 

с:

table(dat$Nationality) 

R просто возвращает общее число наблюдения. Как я могу сказать R только для того, чтобы выбрать национальность каждого субъекта один раз?

+1

Pssst! Существует сайт http://datascience.stackexchange.com/, посвященный науке о данных. Может быть, вам лучше помочь там ... Что касается форматирования столбцов таблицы, люди обычно используют блоки кода (в редакторе post используйте кнопку '{}' или CTRL + K над выбранным текстом). – TLama

+0

уточните, что вы подразумеваете под «выбрать национальность каждого субъекта один раз». какой результат вы хотите посмотреть? –

+1

Спасибо. Я буду помнить об этом в следующий раз :). Данные, используемые, чтобы посмотреть, как это после того, как таблицы (Дат $ национальности) (я просто использовать «данные» выше для иллюстрации) G 3 D 2 S 4 Но я хочу, чтобы это было : G 1 D 2 S 3 , поскольку существует только один G человек, один D человек, один S человек – Braino

ответ

5

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 (!) Секунд ...

+0

Ого, вы, ребята, быстро, спасибо большое! Только что попробовал: 'с (dat, table (tapply (as.character (Национальность), list (Subject), head, n = 1)))' И это работает! Большое спасибо! – Braino

Смежные вопросы