首页 > 解决方案 > 如何根据其他行创建新的数据行

问题描述

我有一个abund类似于包中使用的dunedune.env数据集的数据框(vegan数据是收集到的每个物种的丰度。

 SampleID   MethodA     MethodB     SpA    SpB    SpC   ...
 18001        A1          B1          0      3     4 
 18001        A1          B2          1      5     0
 18001        A2          B1          0      7     0          
 18001        A2          B2          0      11    0
 18002        A1          B1          4      1     0
 18002        A1          B2          0      0     3
 18002        A2          B1          0      0     0
 18002        A2          B2          0      8     2
 18003        A1          B1          0      9     0
 ....

我想whole根据这些数据创建一个新数据集 ( ),但只有 SampleID 和 MethodA 作为行标识符。

 SampleID   MethodA     MethodB     SpA    SpB    SpC   ...
 18001        A1          B3          1      8     4 
 18001        A2          B3          0      18    0          
 18002        A1          B3          4      1     3
 18002        A2          B3          0      8     2
 18003        A1          B3          0      9     1
 ....

一个额外的转折是,我首先想将 B1 乘以 15(即:B3 = 15*B1 + B2),而不是仅仅添加来自 B1 + B2 的数据。

我有两个问题。

  1. 仅乘以某些数据行。

我尝试使用 if 语句:

wholeCalc <- function(MethodB, multiplier=15){
  whole <- MethodB* multiplier
  if(MethodB= "B2") {
    whole <- whole/multiplier
  }
}

-> 有一堆错误表明我离题了!

  1. 弄清楚如何根据 SampleID 和 MethodA 对数据进行分组。

我尝试了多种方法对数据进行分组,但收效甚微。

aggregate(abund, 
          list(Group=replace(rownames(abund$MethodB),
                             rownames(abund$MethodB) 
                             %in% 
                               c("B1","B2"), 
                             "B3")), 
          sum)

-> 我收到一个错误,即参数长度必须相同(即 B1 和 B2)。

whole <- abund %>%
  group_by(SampleID, MethodA)
whole

-> 这给了我开始时相同的数据集。

rbind(abund, 
      c(MethodB = "B3", 
        abund[abund$MethodB == "B1", -3] + 
          abund[abund$MethodB == "B2", -3])) 

-> 这给了我一个错误,因为 B1 和 B2 的行数不匹配。

如您所见,我完全迷路了,需要一些帮助!在过去的几个月里,我一直在实验室里,让我的 R 技能生锈了。

标签: rif-statementaggregaterbind

解决方案


推荐阅读