【问题标题】:Dataframe: Divide each group by a vector corresponding to each group in R?数据框:将每个组除以对应于R中每个组的向量?
【发布时间】:2018-11-19 13:59:58
【问题描述】:

我有一个这样的数据框:

df1 <- structure(list(user_id = c(1, 1, 1, 2, 2, 2, 3, 3, 3), param_a = c(123, 
2.3, -9, 1, -0.03333, 4, -41, -12, 0.89)), .Names = c("user_id", 
"param_a"), row.names = c(NA, -9L), class = c("tbl_df", "tbl", 
"data.frame"))

还有另一个dataframe 的向量:

df2 <- structure(list(user_id = c(1, 2, 3), param_b = c(34, 12, -0.89
)), .Names = c("user_id", "param_b"), row.names = c(NA, -3L), class = c("tbl_df", 
"tbl", "data.frame"))

现在我想将df1 中的每个组除以df2 中的相应值:

例如对于一组用户 1 将每一行除以param_b 第一个向量:

    user_id param_a
    1       123/34 
    1       2.3/34 
    1      -9/34
    2       1/12
    2      -0.03333/12
    2       4/12
....

对于用户 2,每行除以 param_b 第二个向量。

请告知如何将按用户 dataframe 分组的每个组除以一个向量?

附言

如果我将 df1 扩展到 param_a、param_k、param_p

df2 相应地扩展了 param_b、param_l、param_r

我该如何执行这种操作? @nicola 提出了一个非常好的解决方案,但我想扩展它。

【问题讨论】:

  • 试试df1$param_a/df2$param_b[match(df1$user_id,df2$user_id)]
  • @nicola 它不起作用
  • @nicola,如果我有 param_a、param_k、param_p 和 param b 是多个数字的向量,它不起作用。
  • 它适用于您的示例。你应该说明它为什么不起作用并提供一个更好的例子。 FWIW,这种“行不通”,没有其他任何东西是如此令人沮丧,让我质疑为什么我仍然在这个网站上试图帮助别人。
  • @nicola,对不起。你是完全正确的。我只是认为这是一种通用的方法,但是当我将它应用于更多变量时,它就不起作用了。你能给些建议么?我会尽快更新我的问题。

标签: r dataframe datatable


【解决方案1】:

这样的?

 df1%>%
       left_join(df2)%>%
       mutate(result=param_a/param_b)
    Joining, by = "user_id"
    # A tibble: 9 x 4
      user_id   param_a param_b    result
        <dbl>     <dbl>   <dbl>     <dbl>
    1       1  123        34      3.62   
    2       1    2.3      34      0.0676 
    3       1   -9        34     -0.265  
    4       2    1        12      0.0833 
    5       2   -0.0333   12     -0.00278
    6       2    4        12      0.333  
    7       3  -41        -0.89  46.1    
    8       3  -12        -0.89  13.5    
    9       3    0.89     -0.89  -1 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多