我试图避免使用 loop
来重新编码家庭伴侣的变量标识。hldid
表示家庭,而 persid
表示家庭中的人。
变量 partner
表示合作伙伴的 persid
,child
表示该行是否为子行。
变量 partner
中缺少的是双方的 persid
。
例如对于 hldid == 1
, persid == 1
对于 0
的值为 partner
,而它应该是 2
。
这是数据的样子:
> test
hldid persid age sex relresp partner child
1 1 1 26 2 0 0 0
2 1 2 26 1 1 1 0
3 2 1 59 2 0 0 0
4 2 2 64 1 1 1 0
5 3 1 76 2 0 0 0
6 4 1 65 2 0 0 0
7 4 2 64 1 1 1 0
8 5 1 52 2 0 0 0
9 5 2 51 1 1 1 0
10 5 3 20 2 21 0 1
11 5 4 14 2 21 0 1
12 7 1 69 1 0 0 0
13 7 2 70 2 1 1 0
我设法创建了一个非常丑陋的循环,但是对于整个数据集来说它太慢了。
test$partnerREC = test$partner
for(i in 1:13){
for(j in 1:13){
if(
test$hldid[i] == test$hldid[i+1] & # verify if household is the same
(test$persid[i] == test$partner[j])
)
{
test$partnerREC[i] = test$persid[j] # put the persid for each partner
}
}
}
> test
hldid persid age sex relresp partner child partnerREC
1 1 1 26 2 0 0 0 2
2 1 2 26 1 1 1 0 1
3 2 1 59 2 0 0 0 2
4 2 2 64 1 1 1 0 1
5 3 1 76 2 0 0 0 0
6 4 1 65 2 0 0 0 2
7 4 2 64 1 1 1 0 1
8 5 1 52 2 0 0 0 2
9 5 2 51 1 1 1 0 1
10 5 3 20 2 21 0 1 0
11 5 4 14 2 21 0 1 0
12 7 1 69 1 0 0 0 2
13 7 2 70 2 1 1 0 1
知道如何使用
data.table
来解决这个问题吗?test = structure(list(hldid = c(1, 1, 2, 2, 3, 4, 4, 5, 5, 5, 5, 7,
7), persid = c(1, 2, 1, 2, 1, 1, 2, 1, 2, 3, 4, 1, 2), age = c(26,
26, 59, 64, 76, 65, 64, 52, 51, 20, 14, 69, 70), sex = c(2, 1,
2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2), relresp = c(0, 1, 0, 1, 0,
0, 1, 0, 1, 21, 21, 0, 1), partner = c(0, 1, 0, 1, 0, 0, 1, 0,
1, 0, 0, 0, 1), child = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
0)), class = "data.frame", row.names = c(NA, -13L))
最佳答案
一个可能的解决方案:
library(data.table) # load the package
setDT(test) # convert 'test' to a 'data.table'
test[, partnerREC := persid[c(pmin(2,.N):1,rep(0,(pmax(.N,2)-2)))] *
(persid %in% 1:2) *
(.N != 1)
, by = hldid][]
这使:
此解决方案基于假设(源自示例数据),即只有“persid”1 和 2 是合作伙伴,任何更高的都是 child 。
这是做什么的:
hldid
分组 persid[c(pmin(2,.N):1,rep(0,(pmax(.N,2)-2)))]
其中 pmin
用于确保当一个家庭只有一个人时构建长度为 1 的向量。 (persid %in% 1:2)
相乘以获得 child 的 zores。 (.N != 1)
相乘以获得一个人家庭的零值。 关于r - 匹配家庭伙伴无循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53504608/