如何在R中为四分位数范围创建变量?

时间:2018-10-18 13:25:36

标签: r

我有一个数据集(瑞士联邦统计局,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是每个观察值的四分位数范围-这是我正在建立的变量。

1 个答案:

答案 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