2015-01-10 5 views
2

Мои данные выглядит следующим образом:Как подсчитать число конкретных значений

ID CO MV 
1 0 1  
1 5 0 
1 0 1  
1 9 0  
1 8 0  
1 0 1  
2 69 0  
2 0 1  
2 8 0  
2 0 1  
2 78 0  
2 53 0  
2 0 1  
2 3 0  
3 54 0  
3 0 1  
3 8 0  
3 90 0  
3 0 1  
3 56 0  
4 0 1  
4 56 0  
4 0 1  
4 45 0  
4 0 1  
4 34 0  
4 31 0  
4 0 1  
4 45 0  
5 0 1  
5 0 1  
5 67 0 

Я хочу, чтобы выглядеть следующим образом:

ID CO MV CONUM 
1 0 1  3 
1 5 0  3 
1 0 1  3 
1 9 0  3 
1 8 0  3 
1 0 1  3 
2 69 0  5 
2 0 1  5 
2 8 0  5 
2 0 1  5 
2 78 0  5 
2 53 0  5 
2 0 1  5 
2 3 0  5 
3 54 0  4 
3 0 1  4 
3 8 0  4 
3 90 0  4 
3 0 1  4 
3 56 0  4 
4 0 1  5 
4 56 0  5 
4 0 1  5 
4 45 0  5 
4 0 1  5 
4 34 0  5 
4 31 0  5 
4 0 1  5 
4 45 0  5 
5 0 1  1 
5 0 1  1 
5 67 0  1 

Я хочу, чтобы создать столбец CONUM, которое общее число значений, отличных от нуля, в столбце CO для каждого значения в столбце ID. Так, например, столбец CO для идентификатора 1 имеет 3 значения, отличных от нуля, поэтому соответствующие значения в столбце CONUM равны 3. Столбец MV равен 0, если столбец CO имеет значение и 1, если столбец CO равен 0. Таким образом, другой способ выполнить создание столбца CONUM будет состоять в подсчете количества нулей на идентификатор. Было бы здорово, если бы вы могли помочь мне с кодом r для этого. Благодарю.

+0

Этот сайт не должен делать ваша работа для вас. сделайте работу, если вы застрянете, мы поможем. – Dani

+1

Подсказка: посмотрите на '? Ave' –

+0

Как вы сохранили свои данные? – Drupalist

ответ

3

Вы можете использовать ave в базе R:

dat <- transform(dat, CONUM = ave(as.logical(CO), ID, FUN = sum)) 
5

Вот вариант с data.table

library(data.table) 
setDT(df)[,CONUM:=sum(CO!=0) ,ID][] 
3

и вариант с dplyr

# install.packages("dplyr") 
library(dplyr) 

dat <- dat %>% 
    group_by(ID) %>% 
    mutate(CONUM = sum(CO != 0)) 
Смежные вопросы