Суммируйте конкретные наблюдения, основанные на определенных логических утверждениях для переменной ID, используя R - PullRequest
1 голос
/ 04 мая 2019

У меня есть набор данных, который содержит почтовый индекс, а также 2 индикаторные переменные, обозначающие расу и этническую принадлежность человека, а также количество для каждой комбинации. Доступ к данным можно получить следующим образом:

Data1990 <- read.table("https://www2.census.gov/programs-surveys/popest/tables/1990-2000/intercensal/st-co/stch-icen1990.txt")
names(Data1990)<-c("Year","ZIP","Age","Race","Ethnic","Count")
Data1990<-Data1990[,c(2,4:6)]

Данные выглядят так:

   ZIP Race Ethnic Count
1 1001    1      1   239
2 1001    2      1   203
3 1001    1      1   821
4 1001    2      1   769
5 1001    1      1  1089
6 1001    2      1   961

Я хотел бы создать новый набор данных, который будет содержать долю белых неиспаноязычных (раса = 1 или 2 и этническая принадлежность = 1) в этом конкретном почтовом индексе. Я попытался получить сумму белых неиспаноязычных для каждого почтового индекса, используя forloop. Тем не менее, этот код просто дает переменной "White" 0 для каждого наблюдения.

zip<-unique(Data1990$ZIP)
Data1990New<-data.frame(zip,White=NA)
for(i in zip){
Data1990New[which(zip==i),]$White <- sum(Data1990[(Data1990$Race==1 |Data1990$Race==2)&Data1990$Ethnic==1&
                                      Data1990$ZIP==Data1990New$i,][,4])
}

head(Data1990New)

Я хотел бы сделать это более эффективным способом, так как forloops работают медленно. Это актуально, но я думаю, что мой вопрос немного отличается, так как у меня есть переменная ID.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Рассмотрим расчет Белый , а затем aggregate для пропорций:

Data1990$White <- with(Data1990, ifelse((Race==1 | Race==2) & Ethnicity==1, 1, 0))

agg <- do.call(data.frame, 
               aggregate(White ~ ZIP, Data1990, 
                         function(x) c(Total_All = length(x), Total_White = sum(x),
                                       White_Prop = sum(x) / length(x)))
       )

Примечание. Каждый почтовый индекс отображает одинаковый размер и белые суммы. Проверьте исходные данные.

1 голос
/ 04 мая 2019

Данные кажутся сбалансированными, может быть, нам нужно filter на основе условий, сгруппированных по 'ZIP' и получивших sum из 'Count'

library(dplyr)
Data1990 %>% 
   filter(Ethnic == 1, Race %in% 1:2) %>% 
   group_by(ZIP) %>%
   summarise(White = sum(Count))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...