【问题标题】:Divide every value in one column by the largest value based on the values of another column (subject)根据另一列(主题)的值,将一列中的每个值除以最大值
【发布时间】:2021-06-15 18:20:19
【问题描述】:

我有一个包含subject 列和size 列的数据列表,如下面的示例数据。对于每个主题,我需要将size 列中的每个值除以最大值,以便大小值之间的范围为 0 - 1。

以下面的示例数据为例,我需要将主题 1 的每个尺寸值除以 9,并将主题的每个尺寸值除以 8。

由于我的真实数据中有很多主题,是否有任何方法可以自动为每个主题执行此操作?

sample <- structure(list(subject = c("subject1", "subject1", "subject1", 
                                     "subject1", "subject1", "subject2", "subject2", "subject2", "subject2", 
                                     "subject2"), size = c(9L, 8L, 5L, 8L, 3L, 4L, 4L, 8L, 4L, 2L)), row.names = c(NA, 
                                                                                                                   -10L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x00000259dd551ef0>) 

【问题讨论】:

    标签: r


    【解决方案1】:

    使用by 参数,数据表可以轻松地“按组”执行操作:

    sample[, result := size / max(size, na.rm = TRUE), by = .(subject)]
    sample
    #      subject size    result
    #  1: subject1    9 1.0000000
    #  2: subject1    8 0.8888889
    #  3: subject1    5 0.5555556
    #  4: subject1    8 0.8888889
    #  5: subject1    3 0.3333333
    #  6: subject2    4 0.5000000
    #  7: subject2    4 0.5000000
    #  8: subject2    8 1.0000000
    #  9: subject2    4 0.5000000
    # 10: subject2    2 0.2500000
    

    【讨论】:

      【解决方案2】:

      dplyr 在这里很有帮助。您可以使用group_by 函数对每个主题进行计算。

      library(dplyr)
      
      sample %>% 
        dplyr::group_by(subject) %>% 
        dplyr::mutate(results = size / max(size))
      

      输出

      # A tibble: 10 × 3
      # Groups:   subject [2]
         subject   size results
         <chr>    <int>   <dbl>
       1 subject1     9   1    
       2 subject1     8   0.889
       3 subject1     5   0.556
       4 subject1     8   0.889
       5 subject1     3   0.333
       6 subject2     4   0.5  
       7 subject2     4   0.5  
       8 subject2     8   1    
       9 subject2     4   0.5  
      10 subject2     2   0.25 
      

      或者如果你不再需要大小列,那么你可以使用dplyr::mutate(size = size / max(size))

      数据

      sample <-
        structure(
          list(
            subject = c(
              "subject1",
              "subject1",
              "subject1",
              "subject1",
              "subject1",
              "subject2",
              "subject2",
              "subject2",
              "subject2",
              "subject2"
            ),
            size = c(9L, 8L, 5L, 8L, 3L, 4L, 4L, 8L, 4L, 2L)
          ),
          row.names = c(NA,-10L),
          class = c("data.table", "data.frame")
        )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 2020-12-03
        • 2022-01-24
        • 2021-05-25
        • 2021-10-16
        • 2021-07-25
        相关资源
        最近更新 更多