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

时间:2018-04-26 02:15:53

标签: arrays r dataframe lookup data-manipulation

我有一个文件,其中包含与 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 

我想添加一个变量 depression_sum ,为观察中列出的每个ID查找抑郁的值,然后将它们相加。例如,第一个观察包括其各种 friendid_n 变量的ID 3,6和5。这三个ID的抑郁值分别为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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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连接)。你可以在没有整齐的基础上做到这一点,但这有点痛苦。

答案 2 :(得分:1)

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

使用base-R的{​​{1}}中的解决方案:

apply