如何基于其他行创建新的数据行

时间:2019-04-29 04:35:39

标签: r if-statement aggregate rbind

我有一个数据框(abund)与dune包中使用的dune.envvegan数据集相似,除了前三列总结了sampleID和两种方法用于收集数据。数据是收集的每种物种的丰度。

 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 + B2中的数据相加,还想将B1乘以15(即:B3 = 15 * 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技能变得生疏。

0 个答案:

没有答案