【问题标题】:lookup and sum values associated with different IDs与不同 ID 关联的查找和求和值
【发布时间】:2018-10-06 14:42:36
【问题描述】:

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

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

【问题讨论】:

  • 您可能希望将列重命名为 friendid_a, _b, _c, _d 以避免混淆
  • 刚刚做了 - 谢谢!

标签: arrays r dataframe lookup data-manipulation


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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 中执行此操作,但这有点痛苦。

    【讨论】:

      【解决方案3】:

      可以通过添加一列来修改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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-22
        • 2012-12-21
        相关资源
        最近更新 更多