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