【问题标题】:Creating a new column using existing values from other columns using R使用 R 使用其他列中的现有值创建新列
【发布时间】:2018-08-20 22:04:51
【问题描述】:

我正在尝试计算一段时间内的体重减轻,因此初始体重非常重要。我想根据每个托盘的“天”=0 的重量创建一个“初始重量”列。示例如下:

Day   Tray  Weight    Initial Weight  
0      1     3303       3303
3      1     3302.4     3303 
6      1     3303       3303       
15     1     3295.3     3303
36     1     3281.2     3303
0      2     3428       3428
3      2     3426       3428
6      2     3425       3428
15     2     3422       3428
36     2     3417       3428

一旦我有了初始体重值,我就可以在一个新列中计算我的体重减轻:(初始体重-体重(t))/初始体重。

data.frame(
         Day = c(0L, 3L, 6L, 15L, 36L, 0L, 3L, 6L, 15L, 36L),
        Tray = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L),
      Weight = c(3303, 3302.4, 3303, 3295.3, 3281.2, 3428, 3426, 3425, 3422, 3417)
)

【问题讨论】:

    标签: r data-transform


    【解决方案1】:

    dplyr 这样做的方式

    library(tidyverse)
    
    data.frame(
             Day = c(0L, 3L, 6L, 15L, 36L, 0L, 3L, 6L, 15L, 36L),
            Tray = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L),
          Weight = c(3303, 3302.4, 3303, 3295.3, 3281.2, 3428, 3426, 3425, 3422, 3417)
    ) %>% 
      mutate(inw = case_when(Day == 0 ~ Weight, TRUE ~ -99)) %>% 
      group_by(Tray) %>% 
      mutate(inw = max(inw)) %>% 
      mutate(loss = (inw-Weight) / inw)
    

    结果

         Day  Tray Weight   inw     loss
       <int> <int>  <dbl> <dbl>    <dbl>
     1     0     1  3303    3303 0       
     2     3     1  3302.4  3303 0.000182
     3     6     1  3303    3303 0       
     4    15     1  3295.3  3303 0.00233 
     5    36     1  3281.2  3303 0.00660 
     6     0     2  3428    3428 0       
     7     3     2  3426    3428 0.000583
     8     6     2  3425    3428 0.000875
     9    15     2  3422    3428 0.00175 
    10    36     2  3417    3428 0.00321 
    

    【讨论】:

    • 请注意您丢失了小数点。正确的inw3302.4 并且你有33024 没有小数点。
    • @SelcukAkbas 效果很好。只是想知道,当你使用case_when时,TRUE~-99是什么意思?
    • 其余的情况。与其他类似
    【解决方案2】:

    这是一个基于 R 的方法

    > df1$Initial_Weight <- unlist(lapply(split(df1, df1$Tray), function(x) rep(x$Weight[x$Day==0], nrow(x))))
    > df1$Loss <- (df1$Initial_Weight-df1$Weight)/df1$Initial_Weight
    > df1
       Day Tray Weight Initial_Weight         Loss
    1    0    1 3303.0           3303 0.0000000000
    2    3    1 3302.4           3303 0.0001816530
    3    6    1 3303.0           3303 0.0000000000
    4   15    1 3295.3           3303 0.0023312140
    5   36    1 3281.2           3303 0.0066000606
    6    0    2 3428.0           3428 0.0000000000
    7    3    2 3426.0           3428 0.0005834306
    8    6    2 3425.0           3428 0.0008751459
    9   15    2 3422.0           3428 0.0017502917
    10  36    2 3417.0           3428 0.0032088681
    

    数据:

    df1 <- read.table(text="Day   Tray  Weight    
    0      1     3303       
    3      1     3302.4
                      6      1     3303
                      15     1     3295.3
                      36     1     3281.2
                      0      2     3428
                      3      2     3426
                      6      2     3425
                      15     2     3422
                      36     2     3417", header=TRUE)
    

    【讨论】:

      【解决方案3】:

      一个简单的基本 R 解决方案如下。

      dat$Initial_Weight <- with(dat, ave(Weight, Tray, FUN = function(x) x[1]))
      dat$Loss <- with(dat, (Initial_Weight - Weight)/Initial_Weight)
      
      dat
      #   Day Tray Weight Initial_Weight         Loss
      #1    0    1 3303.0           3303 0.0000000000
      #2    3    1 3302.4           3303 0.0001816530
      #3    6    1 3303.0           3303 0.0000000000
      #4   15    1 3295.3           3303 0.0023312140
      #5   36    1 3281.2           3303 0.0066000606
      #6    0    2 3428.0           3428 0.0000000000
      #7    3    2 3426.0           3428 0.0005834306
      #8    6    2 3425.0           3428 0.0008751459
      #9   15    2 3422.0           3428 0.0017502917
      #10  36    2 3417.0           3428 0.0032088681
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-09
        • 1970-01-01
        • 2022-07-05
        • 2015-08-01
        相关资源
        最近更新 更多