根据两个因素计算具有增长率的新列,而不会破坏数据帧

时间:2016-12-04 20:38:53

标签: r dataframe calculated-columns

Hej hej,

我想计算增长率,将它们存储在我的数据框的新列中,例如名为growth.per.day。我 - 一如既往 - 正在寻找一种不包含数百和数百行手动编辑代码的方法。

我有六种水平的藻类和25种营养素 这意味着我有150个“子组”,我想为其计算费率。这些子集的长度根据单个藻类而不同。

所以,基本上:

藻类A - >

营养素(1) - > C.mikro.gr.L(第2天) - C.mikro.gr.L(第1天),C.mikro.gr.L(第3天) - C.mikro.gr.L(第2天)...... ;

营养素(2) - > C.mikro.gr.L(第2天) - C.mikro.gr.L(第1天),C.mikro.gr.L(第3天) - C.mikro.gr.L(第2天)......等

我已经用藻类分割了数据框

X <- split(data, data$ALGAE)
names(X) <- c("ANKI", "CHLAMY", "MIX_A", "MIX_B", "SCENE", "STAURA")
list2env(X, envir = .GlobalEnv) 

我也将它们分开了,创造了前面提到的可爱的150个子集。然后我申请了

ratio1$growth.per.day <- c(NA,ratio1[2:nrow(ratio1), 16] - ratio1[1:(nrow(ratio1)-1), 16])

这是完美的,做我想要的,但我真的非常欣赏更短,更优雅的方式,而不会屠杀我的数据帧。

'data.frame':   3550 obs. of  16 variables:
 $ SAMPLE.ID   : Factor w/ 150 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ COMMUNITY   : chr  "com.1" "com.1" "com.1" "com.1" ...
 $ NUTRIENT    : Factor w/ 25 levels "1","2","3","4",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ RATIO       : Factor w/ 23 levels "3.2","4","5.4",..: 11 9 6 4 1 14 10 8 5 2 ...
 $ PHOS        : Factor w/ 5 levels "0.09","0.195",..: 5 5 5 5 5 4 4 4 4 4 ...
 $ NIT         : Factor w/ 5 levels "1.5482","3.0964",..: 5 4 3 2 1 5 4 3 2 1 ...
 $ DATUM       : Factor w/ 35 levels "30.08.16","31.08.16",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ DAY         : int  0 0 0 0 0 0 0 0 0 0 ...
 $ TYPE        : chr  "mono" "mono" "mono" "mono" ...
 $ ALGAE       : Factor w/ 6 levels "ANK","CHLA","MIX A",..: 5 5 5 5 5 5 5 5 5 5 ...
 $ MEAN        : num  864 868 882 873 872 ...
 $ GROW        : num  0.00116 0.00115 0.00113 0.00115 0.00115 ...
 $ FLUORO      : num  NA NA NA NA NA NA NA NA NA NA ...
 $ MEAN.MQ     : num  0.964 0.969 0.985 0.975 0.973 ...
 $ GROW.MQ     : num  1.04 1.03 1.02 1.03 1.03 ...
 $ C.mikro.gr.L: num  -764 -913 -1394 -1085 -1039 ...

我希望这能够充分描述这个问题,

非常感谢!

1 个答案:

答案 0 :(得分:0)

希望这是你要求的:

df = data.frame(algae = sort(rep(LETTERS[1:6], 20)),
                nutrient = rep(letters[22:26], 24),
                day = rep(c(rep(1, 5), 
                        rep(2, 5),
                        rep(3, 5),
                        rep(4, 5)), 6),
                growth = runif(120, 30, 60))

library(dplyr)

df = df %>% group_by(algae, nutrient) %>% mutate(rate = c(NA, diff(growth, lag = 1)))

还有藻类A和营养素v的表格:

   algae nutrient   day   growth      rate
  <fctr>   <fctr> <dbl>    <dbl>     <dbl>
1      A        v     1 48.68547        NA
2      A        v     2 55.63570  6.950232
3      A        v     3 53.28569 -2.350013
4      A        v     4 44.83022 -8.455465