2016-02-17 2 views
0

Я начал постепенно переходить в R из Excel, но у меня все еще возникают трудности с (относительно простыми) вычислениями.Как вычислить переменную частоты (счетчика) в R?

Я хочу, чтобы создать версию частоты моих переменных х, давайте назовем его «xfrequency».

Пожалуйста, ознакомьтесь с образцом моих данных ниже.

Требуемая переменная xfrequency должна в основном рассчитывать количество x в течение определенного периода (country-year). В образце данных период наблюдения - с 1990 по 1995 год. Так, в 1994 году Канада получила всего 4 х.

Возможно, существует соответствующая функция для этого? Благодаря!

country year x xfrequency 
CAN  1990 1 1 
CAN  1991 0 0 
CAN  1992 1 2 
CAN  1993 0 0 
CAN  1994 2 4 
CAN  1995 1 5 
USA  1990 0 0 
USA  1991 2 2 
USA  1992 1 3 
USA  1993 0 0 
USA  1994 1 4 
USA  1995 0 0 
GER  1990 NA NA 
GER  1991 1 1 
GER  1992 0 0 
GER  1993 1 2 
GER  1994 2 4 
GER  1995 1 5 
+0

В 1994 году Канада получила всего 5 штук, а не 4 :-) –

+0

@TimBiegeleisen 1 + 1 + 2 = 4 ... как вы находите 5? – Tensibai

+0

@TimBiegeleisen Q - это создание столбца xfrequency, если я правильно понял, т. Е. Суммировать с 1990 года по текущий год значения x по странам. – Tensibai

ответ

2

Пример с data.table предположении, что ваш набор данных в переменной с именем data:

library(data.table) 
setDT(data) 
data[is.na(x),x := 0] # Remove the NA as a sum of anything with NA is NA 
data[, xfreq := cumsum(x), by=country] 

Что дает:

country year x xfrequency xfreq 
1:  CAN 1990 1   1  1 
2:  CAN 1991 0   0  1 
3:  CAN 1992 1   2  2 
4:  CAN 1993 0   0  2 
5:  CAN 1994 2   4  4 
6:  CAN 1995 1   5  5 
7:  USA 1990 0   0  0 
8:  USA 1991 2   2  2 
9:  USA 1992 1   3  3 
10:  USA 1993 0   0  3 
11:  USA 1994 1   4  4 
12:  USA 1995 0   0  4 
13:  GER 1990 0   NA  0 
14:  GER 1991 1   1  1 
15:  GER 1992 0   0  1 
16:  GER 1993 1   2  2 
17:  GER 1994 2   4  4 
18:  GER 1995 1   5  5 

это точно не ваш ожидаемый результат, но в соответствии с описанием вас дайте, столбец xfreq кажется тем, что вы ищете.

Чтобы получить точный результат, мы можем сбросить xfreq 0 при х 0:

> data[x==0,xfreq := 0] 
> data 
    country year x xfrequency xfreq 
1:  CAN 1990 1   1  1 
2:  CAN 1991 0   0  0 
3:  CAN 1992 1   2  2 
4:  CAN 1993 0   0  0 
5:  CAN 1994 2   4  4 

Или в один проход с тестом:

data[, xfreq := ifelse(x==0,0L,cumsum(x)), by=country] 
+0

cool - огромное спасибо! – FKG

0

Вы можете использовать библиотеку (dplyr).

library(dplyr) 
sum_data <- data %>% group_by(country) %>% summarise(xfrequency = sum(x, na.rm=T)). 

Я только что сгруппировал ваши данные по странам и добавил сумму х для всех периодов, заданных для этой страны.

+1

Это не дает столбца xfrequency, который ищет OP. – Tensibai

+0

Спасибо DenisK. Но это приводит к таким же результатам, как и в plyr: 'newdata <- ddply (mydata, ~ country, summary, xfrequency = sum (x, na.rm = TRUE))' и дает общую сумму x для всех лет вместе взятых.Так что не то, что я хотел, но, возможно, полезно знать в будущем – FKG

2

Основание R альтернатива:

mydf <- transform(mydf, xfreq = ave(x, country, FUN = function(x) cumsum(!is.na(x)))) 
mydf[mydf$x==0 | is.na(mydf$x), "xfreq"] <- 0 

дает:

> mydf 
    country year x xfrequency xfreq 
1  CAN 1990 1   1  1 
2  CAN 1991 0   0  0 
3  CAN 1992 1   2  3 
4  CAN 1993 0   0  0 
5  CAN 1994 2   4  5 
6  CAN 1995 1   5  6 
7  USA 1990 0   0  0 
8  USA 1991 2   2  2 
9  USA 1992 1   3  3 
10  USA 1993 0   0  0 
11  USA 1994 1   4  5 
12  USA 1995 0   0  0 
13  GER 1990 NA   NA  0 
14  GER 1991 1   1  1 
15  GER 1992 0   0  0 
16  GER 1993 1   2  3 
17  GER 1994 2   4  4 
18  GER 1995 1   5  5 
Смежные вопросы