如何在R中进行行间计算

如何在R中进行行间计算,r,duplicates,R,Duplicates,我有一个ID重复的数据集,如何计算 每个ID的A+B(获取A和B值的总和) 每个ID的A/B(计算A/B) 将结果包括到数据集中 ID首先,由于您不需要时间,所以请删除时间列Time,然后将时间列值分散到多个列中,并让该列测试告诉您将其分散到哪个列中: [编辑/备注:本答案中的数据集指OP的原始数据集,该数据集后来由OP编辑] library(tidyr)#用于传播(.) tab与@akraf的答案非常相似,但带有dplyr语法: library(dplyr) library(tidyr) d

我有一个ID重复的数据集,如何计算

  • 每个ID的A+B(获取A和B值的总和)
  • 每个ID的A/B(计算A/B)
  • 将结果包括到数据集中

  • ID首先,由于您不需要时间,所以请删除时间列
    Time
    ,然后
    将时间列
    分散到多个列中,并让该列
    测试
    告诉您将其分散到哪个列中:

    [编辑/备注:本答案中的数据集指OP的原始数据集,该数据集后来由OP编辑]

    library(tidyr)#用于传播(.)
    
    tab与@akraf的答案非常相似,但带有
    dplyr
    语法:

    library(dplyr)
    library(tidyr)
    
    data %>%
      select(-Time) %>%
      spread(Test, value) %>%
      mutate(sum = A+B,
             ratio = A/B)
    
    结果:

      ID  A  B  C sum     ratio
    1  1  5  6 NA  11 0.8333333
    2  2  7 NA NA  NA        NA
    3  3  8  9 10  17 0.8888889
    4  4 11 NA 12  NA        NA
    5  5 NA 13 NA  NA        NA
    

    首先,你试过什么没用的?其次,如何处理既没有A也没有B的ID?未测试:
    使用(您的数据,tapply(值、ID、函数(x)x[Test='A']/x[Test='B'])
    。将1的
    /
    替换为
    +
    。有关3,请参见
    ?merge
    。输出的行数是否相同?我们能假设总是有A和B(不多也不少)吗?干得好,谢谢,我会接受的。但我需要将时间作为变量保存在数据集中。我试图使它更简单,并假设每个id的所有元素都有相同的时间。有没有办法将时间保留在最终数据集中?(请查看上面的新数据集)这正是问题所在,您必须决定在
    spread
    ing时如何处理不同的时间值。由于您的新数据集具有相同ID的相同时间,您只需在我的答案中省略
    子集
    行,它就会起作用。如果同一ID的时间值不同,
    spread
    将为该ID生成多行,用
    NA
    填充缺少的
    A
    B
    C
    值。如果每个ID有多次,您可能会考虑在不同的数据集中分离
    ID
    time
    ,根据您的情况处理该问题,然后在以后使用
    merge
    (或使用dplyr时使用
    full\u join
    )。。。。。。通过使用
    ID
    作为识别列,再次添加时间信息(数据库术语中的“键”/
    by=
    合并参数)
    library(magrittr)
    result <-(   tab 
             %>% subset( TRUE, select=c(-Time)) # Remove column Time
             %>% spread(Test, value)
             %>% within({ r1 <- A/B
                          r2 <- A+B
                       })
             )
    
    result
    
    ##   ID  A  B  C        r1 r2
    ## 1  1  5  6 NA 0.8333333 11
    ## 2  2  7 NA NA        NA NA
    ## 3  3  8  9 10 0.8888889 17
    ## 4  4 11 NA 12        NA NA
    ## 5  5 NA 13 NA        NA NA
    
    library(dplyr)
    library(tidyr)
    
    data %>%
      select(-Time) %>%
      spread(Test, value) %>%
      mutate(sum = A+B,
             ratio = A/B)
    
      ID  A  B  C sum     ratio
    1  1  5  6 NA  11 0.8333333
    2  2  7 NA NA  NA        NA
    3  3  8  9 10  17 0.8888889
    4  4 11 NA 12  NA        NA
    5  5 NA 13 NA  NA        NA