【问题标题】:Normalizing matched data in R在 R 中规范化匹配数据
【发布时间】:2020-09-25 09:49:41
【问题描述】:

考虑:

Pair       X  
 1         2 
 1         3
 2         1
 2         2 

如果我有一个结构类似于上面示例的数据框,我如何在给定 Pair 列的情况下规范化列 X?

换句话说,对于 Pair 1 和 0.333 (1/(1+2)),这两个元素应转换为 0.4 (2/(2+3)) 和 0.6 (3/(2+3))和 .666 (2/(1+2)) 对 2。

【问题讨论】:

  • 我投票结束这个问题,因为它是工作指令,而不是问题。

标签: r normalize


【解决方案1】:

您可以在基础 R 中执行此操作:

df$norm <- with(df, X/ave(X, Pair, FUN = sum))
df
#  Pair X norm
#1    1 2 0.40
#2    1 3 0.60
#3    2 1 0.33
#4    2 2 0.67

dplyr

library(dplyr)
df %>% group_by(Pair) %>% mutate(norm = X/sum(X))

data.table:

library(data.table)
setDT(df)[, norm := X/sum(X), Pair]

数据

df <- structure(list(Pair = c(1L, 1L, 2L, 2L), X = c(2L, 3L, 1L, 2L
)), class = "data.frame", row.names = c(NA, -4L))

【讨论】:

    【解决方案2】:

    我们可以使用base R

    df$norm <- with(df, X/rowsum(X, Pair)[Pair])
    df$norm
    #[1] 0.4000000 0.6000000 0.3333333 0.6666667
    

    数据

    df <- structure(list(Pair = c(1L, 1L, 2L, 2L), X = c(2L, 3L, 1L, 2L
    )), class = "data.frame", row.names = c(NA, -4L))
    

    【讨论】:

      猜你喜欢
      • 2017-06-06
      • 2023-03-26
      • 2020-07-09
      • 2014-07-07
      • 2017-06-01
      • 2014-12-23
      • 2017-01-12
      • 1970-01-01
      相关资源
      最近更新 更多