我试图避免使用 loop 来重新编码家庭伴侣的变量标识。
hldid 表示家庭,而 persid 表示家庭中的人。
变量 partner 表示合作伙伴的 persidchild 表示该行是否为子行。

变量 partner 中缺少的是双方的 persid

例如对于 hldid == 1persid == 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/

    10-11 14:24