查找和求和与不同 ID 关联的值

lookup and sum values associated with different IDs

我有一个文件,其中包含与 ID 的每个唯一值关联的 depression 值。名为 HAVE 的数据框如下所示:

id  depression friendid_A friendid_B friendid_C friendid_D
1          1.0         NA          3          6          5
2          0.6          6          4         NA         NA
3          0.0          1          4          5         NA
4          1.8          1          3         NA          2
5          1.7         NA         NA         NA         NA
6          0.3          2          3         NA         NA 

我想添加一个变量 depression_sum 来查找观察中列出的每个 ID 的 depression 值, 并将它们相加。例如,第一个观察包括其各种 friendid_n 变量的 ID 3、6 和 5。这三个 ID 的 depression 值分别为 0.0、0.3 和 1.7。因此,此观察的 depression_sum 为 2.0.

下面是我要创建的名为 WANT 的数据框:

id  depression  friendid_A  friendid_B  friendid_C  friendid_D  depression_sum
1          1.0          NA           3           6           5            2.0
2          0.6           6           4          NA          NA            2.1
3          0.0           1           4           5          NA            4.5
4          1.8           1           3          NA           2            1.6
5          1.7          NA          NA          NA          NA             NA
6          0.3           2           3          NA          NA            0.6

有没有办法有效地查找这些值并创建一个包含它们总和的变量?

tidyverse 解决方案

library(tidyverse)

WANT <- HAVE %>% 
  gather(key, value, -id, -depression, na.rm = TRUE) %>%
  group_by(id) %>%
  summarize(
    depression_sum = sum(HAVE$depression[match(value, HAVE$id)])
  ) %>%
  left_join(HAVE, .)
HAVE <- read.table(text="id  depression friendid_1 friendid_2 friendid_3 friendid_4
1          1.0         NA          3          6          5
2          0.6          6          4         NA         NA
3          0.0          1          4          5         NA
4          1.8          1          3         NA          2
5          1.7         NA         NA         NA         NA
6          0.3          2          3         NA         NA", header=T, sep='', row.names='id')

friends <- HAVE[, 2:ncol(HAVE)]

那么有两条路可以走:

  • 按行扫描匹配函数,它在每一行中查找 1,2,3... 的匹配项。 (先把friends展开成邻接矩阵可能更容易)
  • 根据@MelissaKey 的建议在 'id' 上使用 merge()(SQL 加入)。您可以在没有 tidyverse 的情况下在 base 中执行此操作,但这有点痛苦。

可以通过向其添加一列来修改 HAVE data.frame 本身。也许,可以避免需要创建另一个 data.frame WANT(由 OP 指定)。

base-R 中使用 apply 的解决方案:

HAVE$depression_sum <- apply(df[3:nrow(df)], 1,
            function(x)sum(df$depression[HAVE$id %in% x], na.rm = TRUE))

HAVE
#   id depression friendid_A friendid_B friendid_C friendid_D depression_sum
# 1  1        1.0         NA          3          6          5            2.0
# 2  2        0.6          6          4         NA         NA            2.1
# 3  3        0.0          1          4          5         NA            4.5
# 4  4        1.8          1          3         NA          2            1.6
# 5  5        1.7         NA         NA         NA         NA            0.0
# 6  6        0.3          2          3         NA         NA            0.6