我有一个数据集(瑞士联邦统计局,STATPOP2016),其中包含瑞士每公顷土地上不同规模的住户数量。换句话说,对于每个i
格,我都有:
x1
个家庭,一个人组成
x2
的两个人组成的家庭
...
x6
家庭中有6个人或以上(为简单起见,我认为他们有6个人)。
我需要创建一个变量,该变量将显示每个公顷的住户数量的四分位数范围。我有可以工作的代码,但是速度很慢。有没有一种更聪明的方式来做同样的事情?
有我的代码:
# Vector that contains all possible sizes of households
vector_hh_size <- c(1:6)
# Variable for interquantile range in household size. A is my dataframe
A$hh_size_IQR <- 0
# Vector that contains frequency of each size of household in a given hectar
vector_hh_frequency <- c(0,0,0,0,0,0)
for (i in 1:NROW(A)) {
for (j in 1:6){
vector_hh_frequency[j] <- eval(parse(text = paste("A$hh",j,"[",i,"]",sep = "")))
}
A$hh_size_IQR[i] <- wtd.quantile(vector_hh_size, weights = vector_hh_frequency)[4] - wtd.quantile(vector_hh_size, weights = vector_hh_frequency)[2]
}
以下是数据示例:
hh1 hh2 hh3 hh4 hh5 hh6 IQR
1 0 3 0 0 0 0 0
2 0 3 0 0 0 0 0
3 0 0 3 0 0 0 0
4 0 3 0 0 0 0 0
5 3 6 3 3 0 0 1
6 0 3 0 0 3 0 3
7 11 7 4 7 3 0 3
8 3 3 0 3 0 0 3
9 3 3 0 3 0 0 3
10 0 3 0 0 0 0 0
#OBS
是观察号,hhi
显示有i
人的家庭数。 IQR
是每个观察值的四分位数范围-这是我正在建立的变量。
答案 0 :(得分:0)
这是您的代码的较短版本:
library("Hmisc")
A <- read.table(header=TRUE, text=
" hh1 hh2 hh3 hh4 hh5 hh6
1 0 3 0 0 0 0
2 0 3 0 0 0 0
3 0 0 3 0 0 0
4 0 3 0 0 0 0
5 3 6 3 3 0 0
6 0 3 0 0 3 0
7 11 7 4 7 3 0
8 3 3 0 3 0 0
9 3 3 0 3 0 0
10 0 3 0 0 0 0")
vector_hh_size <- 1:ncol(A)
myIQR <- function(Ai) wtd.quantile(vector_hh_size, weights=Ai)[4] - wtd.quantile(vector_hh_size, weights=Ai)[2]
A$IQR <- apply(A, 1, myIQR)
# > A
# hh1 hh2 hh3 hh4 hh5 hh6 IQR
# 1 0 3 0 0 0 0 0
# 2 0 3 0 0 0 0 0
# 3 0 0 3 0 0 0 0
# 4 0 3 0 0 0 0 0
# 5 3 6 3 3 0 0 1
# 6 0 3 0 0 3 0 3
# 7 11 7 4 7 3 0 3
# 8 3 3 0 3 0 0 3
# 9 3 3 0 3 0 0 3
# 10 0 3 0 0 0 0 0