2016-12-25 2 views
2

Я хочу написать цикл, который может агрегировать количество экземпляров (определенных значений), которые сгруппированы по году. В частности, скажем, что переменная равна x1. Я хочу иметь две группы, одна, когда x1 = 1, а другой, когда он представляет собой сочетание некоторых значений (2,3 и 5 в приведенном ниже примере):R Циклическое объединение по группам

year x1 
2000 1 
2000 1 
2000 2 
2000 3 
2000 5 

Конечный результат должен выглядеть как это:

year x2 x3 
2000 2  3 

, где x2 и являются отсчеты, когда x1 = 1 и x1 = с (2,3,5), соответственно. Как это можно сделать?

Редактировать: Возможно, следовало бы упомянуть об этом ранее. Я работаю с двумя наборами данных; один df1 годовой (охватывающий около 200 лет), а другой df2 основан на инциденте (около 50 тыс. наблюдений, где в настоящее время находится x1). Таким образом, идея цикла состоит в том, чтобы каждый год [i] смотреть в df2 и суммировать подсчеты, группируя их как x2 и в df1.

Edit2: Ах, я решил, почему представленные ответы не работали для меня. По-видимому, я столкнулся с проблемой dplyr перед проблемой plyr, рассмотренной в этом answer; Я последовал за ответом ManneR и снял plyr. Теперь команда group_by работает снова.

+0

Что distincts одну группу от другой? –

+0

Существуют три переменные, измеряющие одно и то же явление, и все они численные. Тем не менее, я хочу только выделить некоторые категории. Если это помогает, первая группа (x2) всегда является скаляром, тогда как вторая группа (x3) всегда является агрегированным числом нескольких категорий. – rfsrc

ответ

0

Я не уверен, что с ответом user3349904 как это, кажется, делать то, что вы спрашиваете. Его нелегко точно узнать, о чем вы просите, не зная, как выглядят ваши данные. Если ваша проблема с другим решением связана с тем, что df1 необходимо сохранить значения x2 и x3? Последняя часть решит для этого.

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

library(dplyr) 

#create DF1 (years) 
df1 <- as.data.frame(matrix(ncol=3,nrow = 200)) 
df1$V1 <- c(1800:1999) 
colnames(df1) <- c("year","x2","x3") 

#create DF2 (transactions) 
df2 <- as.data.frame(matrix(ncol=2,nrow=50000)) 
#add random sample data 
df2$V1 <- sample(1800:1999,50000,replace = T) 
df2$V2 <- sample(1:5,5000,replace = T) 
colnames(df2) <- c("year","x1") 

# group by year in df2 and aggregate counts based on categories 
df2 %>% group_by(year) %>% 
    summarise(x2 = sum(x1==1), x3 = sum(x1 %in% c(2,3,5))) -> df3 

# match years in df3 and df1 and bring lookup value to df1 
df1$x2 <- df3$x2[match(df1$year,df3$year)] 
df1$x3 <- df3$x3[match(df1$year,df3$year)] 
+0

Я сделал другое редактирование исходного вопроса, команда 'group_by' не работала, поэтому я продолжал получать' df3', который состоит из одного наблюдения. Теперь ваш код делает то, что я хочу, после исправления последовательности загрузки пакета. – rfsrc

-1

Предполагая, что вы начинаете с фрейма данных называется df, это будет считать случаи, как вы описали их по годам:

library(dplyr) 
df %>% group_by(year) %>% summarise(x2 = sum(x1==1), x3 = sum(x1 %in% c(2,3,5))) 
+0

Спасибо за ввод, я уточнил, что мне нужно, отредактировав вопрос. Можете ли вы заставить ее работать так, чтобы она применима к моей проблеме? – rfsrc

0

Вот еще один вариант использования dplyr/tidyr

library(dplyr) 
library(tidyr) 
df1 %>% 
    group_by(year, grp = paste0("x", (x1 != 1) + 2)) %>% 
    summarise(x1= n()) %>% 
    spread(grp, x1) 
# year x2 x3 
#* <int> <int> <int> 
#1 2000  2  3 

Или с помощью base R

xtabs(Freq~year + x1, transform(df1, x1= paste0("x", (x1!=1)+2), Freq= 1)) 
Смежные вопросы