【问题标题】:How to achieve this result in R如何在 R 中实现此结果
【发布时间】:2011-08-04 14:13:49
【问题描述】:

Windows 7 上的 R 版本 2.11.1 32 位

我有两个数据集如下图:

data_set_A:

USER_B   ACTION
10       0.1
11       0.3
12       0.1

data_set_B:

USER_A   USER_B   ACTION
1        10       0.2
1        11       0.1
1        15       0.1
2        12       0.2     

如何将USER_BACTIONdata_set_A添加到data_set_Bdata_set_A 中的 USER_Bdata_set_BUSER_B 的子集。

对于上面的例子,可能是:

USER_A   USER_B   ACTION
1        10       0.2+0.1
1        11       0.1+0.3
1        15       0.1
2        12       0.2+0.1 

data_set_B 中我不需要考虑USER_A,只需考虑USER_B 出现在data_set_A 中。

不知道是否可以不一一实现?

【问题讨论】:

    标签: r algorithm statistics dataset


    【解决方案1】:
    dfa <- data.frame(
            user_b = 10:12,
            action = c(0.1, 0.3, 0.1)
    )
    
    dfb <- data.frame(
            user_a = c(1, 1, 1, 2),
            user_b = c(10, 11, 15, 12),
            action = c(0.2, 0.1, 0.1, 0.2)
    )
    
    
    action <- dfa$action[match(dfb$user_b, dfa$user_b)]
    action[is.na(action)] <- 0
    dfb$action <- dfb$action + action
    dfb
    
      user_a user_b action
    1      1     10    0.3
    2      1     11    0.4
    3      1     15    0.1
    4      2     12    0.3
    

    【讨论】:

      【解决方案2】:

      一种方法是对两个数据集进行等效的数据库合并,以形成您想要的操作对,然后将它们相加。使用@Andrie 的示例代码:

      dfa <- data.frame(
              user_b = 10:12,
              action = c(0.1, 0.3, 0.1)
      )
      
      dfb <- data.frame(
              user_a = c(1, 1, 1, 2),
              user_b = c(10, 11, 15, 12),
              action = c(0.2, 0.1, 0.1, 0.2)
      )
      

      解决方案代码

      我将首先介绍完整的解决方案,然后解释步骤:

      mdat <- merge(dfb, dfa, by = "user_b", all.x = TRUE)
      res <- data.frame(mdat[,c(2,1)],
                        action = rowSums(mdat[, c("action.x", "action.y")], 
                                         na.rm = TRUE))
      res <- res[order(res$user_a, res$user_b),]
      

      res 现在包含结果。

      说明

      我们先合并两个数据框,在user_b上匹配:

      ## merge the data
      mdat <- merge(dfb, dfa, by = "user_b", all.x = TRUE)
      mdat
      

      给予:

      > mdat
        user_b user_a action.x action.y
      1     10      1      0.2      0.1
      2     11      1      0.1      0.3
      3     12      2      0.2      0.1
      4     15      1      0.1       NA
      

      然后我们只使用这个对象来创建结果数据框,并将两个 action. 列按行求和:

      ## format the merged data with summed `action`
      res <- data.frame(mdat[,c(2,1)],
                        action = rowSums(mdat[, c("action.x", "action.y")], 
                                         na.rm = TRUE))
      ## reorder
      res <- res[order(res$user_a, res$user_b),]
      res
      

      导致

      > res
        user_a user_b action
      1      1     10    0.3
      2      1     11    0.4
      4      1     15    0.1
      3      2     12    0.3
      

      【讨论】:

      • +1 用于显示合并。特别是为了表明您可能希望重新排序合并的 data.frame - 我上个月花了几个小时调试一些代码。事实证明,由于我错误地假设合并后的 data.frame 将具有与原始数据相同的顺序(使用 merge(..., all.x=TRUE)),因此引入了该错误。
      猜你喜欢
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      • 2020-12-07
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多