-1

我正在尝试计算一段时间内的体重减轻,因此初始体重非常重要。我想根据每个托盘的“天”=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)
)
4

3 回答 3

0

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 
于 2018-08-20T22:14:12.160 回答
0

这是一个基于 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)
于 2018-08-20T22:18:11.573 回答
0

一个简单的基本 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
于 2018-08-21T10:53:20.120 回答