поиск и сумма значений, связанных с разными идентификаторами - PullRequest
0 голосов
/ 26 апреля 2018

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

Ниже приведен фрейм данных под названием ХОЧУ , который я хотел бы создать:

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 ]

0 голосов
/ 26 апреля 2018
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-соединение) для 'id' согласно предложению @ MelissaKey.Вы можете сделать это в базе без тидиверса, но это немного больно.
0 голосов
/ 26 апреля 2018

Можно изменить 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
0 голосов
/ 26 апреля 2018

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, .)
...