Поиск и суммирование значений, связанных с разными идентификаторами

У меня есть файл, который включает значение депрессии, связанное с каждым уникальным значением идентификатора. Фрейм данных с именем 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 

Я хочу добавить переменную press_sum, которая ищет значение депрессии для каждого идентификатора, указанного в наблюдении, и добавляет их. Например, первое наблюдение включает в себя идентификаторы 3, 6 и 5 для его различных переменных friendid_n. Значения депрессии для этих трех идентификаторов составляют 0, 0, 0,3 и 1,7 соответственно. Депрессия_сумма для этого наблюдения, таким образом, будет 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

Есть ли способ эффективно искать эти значения и создавать переменную, которая включает их сумму?

3 ответа

Решение

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 сам 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
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 в матрицу смежности)
  • использование merge() (SQL join) на 'id' согласно предложению @MelissaKey. Вы можете сделать это на базе без Tidyverse, но это немного больно.
Другие вопросы по тегам