Issue

我有一个用整数编码的家族关系数据框架,其中R01person Nperson 1之间的关系,R02person Nperson 2之间的关系,等等.

然而,每个家族矩阵中只有lower.tri个是编码的,所以我试图编写一个函数,以match表示upper.tri中的正确关系.

Relationships

这些关系用整数编码如下:

1=配偶,2=同居伴侣,3=儿子/女儿,4=继儿子/女儿,5=养子女,6=女婿/儿媳,7=父母/监护人,8=继父母,9=养父母,10=公婆,11=sibling /姐妹,12=继sibling /姐妹,13=养sibling /姐妹,14=sibling /嫂子,15=孙子女,16=外祖父母,17=其他亲属,18=其他非亲属.

因此,这些关系是:

rel = c("1" = 1, "2" = 2, "3" = 7, "4" = 8, "5" = 9, "6" = 10, "7" = 3, "8" = 4, "9" = 5, "10" = 6, "11" = 11, "12" = 12, "13" = 13, "14" = 14, "15" = 16, "16" = 15, "17" = 17, "18" = 18)

Example Data

   household person R01 R02 R03 R04 R05 R06
1          1      1  NA  NA  NA  NA  NA  NA
2          1      2   1  NA  NA  NA  NA  NA
3          1      3   3   3  NA  NA  NA  NA
4          1      4   3   3  11  NA  NA  NA
5          2      1  NA  NA  NA  NA  NA  NA
6          2      2   3  NA  NA  NA  NA  NA
7          2      3  15   3  NA  NA  NA  NA
8          3      1  NA  NA  NA  NA  NA  NA
9          3      2  18  NA  NA  NA  NA  NA
10         4      1  NA  NA  NA  NA  NA  NA
11         5      1  NA  NA  NA  NA  NA  NA
12         5      2   5  NA  NA  NA  NA  NA

Required Output

   household person R01 R02 R03 R04 R05 R06
1          1      1  NA   1   7   7  NA  NA
2          1      2   1  NA   7   7  NA  NA
3          1      3   3   3  NA  11  NA  NA
4          1      4   3   3  11  NA  NA  NA
5          2      1  NA   1  16  NA  NA  NA
6          2      2   3  NA   1  NA  NA  NA
7          2      3  15   3  NA  NA  NA  NA
8          3      1  NA  18  NA  NA  NA  NA
9          3      2  18  NA  NA  NA  NA  NA
10         4      1  NA  NA  NA  NA  NA  NA
11         5      1  NA   9  NA  NA  NA  NA
12         5      2   5  NA  NA  NA  NA  NA

Example Code

df <- data.frame(household = c(1,1,1,1,2,2,2,3,3,4,5,5),
                 person = c(1,2,3,4,1,2,3,1,2,1,1,2),
                 R01 = c(NA, 1, 3, 3, NA, 3, 15, NA, 18, NA, NA, 5),
                 R02 = c(NA, NA, 3, 3, NA, NA, 3, rep(NA, 5)),
                 R03 = c(rep(NA,3), 11, rep(NA, 8)),
                 R04 = rep(NA, 12),
                 R05 = rep(NA, 12),
                 R06 = rep(NA, 12))

我知道有可能编写一个函数来进行矩阵匹配,然后将其应用到每个有dplyr个的家庭,但是我还不擅长函数,所以我在一些领域遇到了问题.

推荐答案

您可以使关系矩阵在每个household中对称,同时根据rel重新编码元素.

library(dplyr)

df %>%
  group_by(household) %>%
  group_modify(~ {
    mat <- as.matrix(.x[-1][1:nrow(.x)])
    mat[upper.tri(mat)] <- recode(t(mat)[upper.tri(mat)], !!!rel)
    cbind(.x[1], as_tibble(mat))
  }) %>% 
  ungroup()

# A tibble: 12 × 6
   household person   R01   R02   R03   R04
       <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl>
 1         1      1    NA     1     7     7
 2         1      2     1    NA     7     7
 3         1      3     3     3    NA    11
 4         1      4     3     3    11    NA
 5         2      1    NA     7    16    NA
 6         2      2     3    NA     7    NA
 7         2      3    15     3    NA    NA
 8         3      1    NA    18    NA    NA
 9         3      2    18    NA    NA    NA
10         4      1    NA    NA    NA    NA
11         5      1    NA     9    NA    NA
12         5      2     5    NA    NA    NA

R相关问答推荐

如何替换R中数据集列中的各种字符串

在位置周围设定一个半径并识别该半径内的其他位置

次级y轴R gggplot2

R for循环返回到先前值

使用tidy—select创建一个新的带有mutate的摘要变量

对于变量的每个值,仅 Select 包含列表中所有值的值.R

使用Facet_WRAP时更改框图中线的 colored颜色

如何从容器函数中提取conf并添加到ggplot2中?

使用Scale_*_MANUAL时在图例中保留未使用的系数级别

更改STAT_VALLES/STAT_PEAKS中的箭头线宽/大小

`-`是否也用于数据帧,有时使用引用调用?

如何阻止围堵地理密度图?

向R中的数据帧添加一列,该列统计另一列中每个唯一值的二进制观测值的数量

为什么不能使用lApply在包装函数中调用子集

将某个阈值以下的列中的值分类到不同的列中,否则保持该列的原样

将Geojson保存为R中的shapefile

创建两个变量组合的索引矩阵

如何将数据框压缩为更宽,同时将行输入保持为行输入,而不是R中的列名?

在R中,如果一个值在同一数据帧中的任何特定列中,如何计算?

将矩阵中特定行的双精度值添加到下一行中