如何在R中的行之间进行计算

时间:2018-01-15 16:50:50

标签: r duplicates

  

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

     
      
  1. 每个ID
  2. 的A + B(得到A和B的值的总和)   
  3. 每个ID的A / B(计算A / B)
  4.   
  5. 将结果包含在数据集中。
  6.   
ID<-c(1,1,2,3,3,3,4,4,5)
Test<-c("A","B","A","A","B","C","A","C","B")
Time<-c(3,3,4,4,4,4,3,3,4)
value<-c(5,6,7,8,9,10,11,12,13)
data<-data.frame(ID,Test,Time,value)




  ID   Test  Time     value
        1     A     3      5
        1     B     3      6
        2     A     4      7
        3     A     4      8
        3     B     4      9
        3     C     4     10
        4     A     3     11
        4     C     3     12
        5     B    4      13

2 个答案:

答案 0 :(得分:2)

首先,删除列Time,因为您不需要它,然后将spreadvalue列到多列,让列Test告诉您哪一列用于传播它们的专栏:

[编辑/备注:此答案中的数据集是指OP​​的原始数据集,后来由OP编辑

library(tidyr) # for spread(.)
tab <- read.table(text=
"ID   Test  Time     value
1     A     jan      5
1     B     feb      6
2     A     march    7
3     A     jan      8
3     B     feb      9
3     C     march   10
4     A     jan     11
4     C     feb     12
5     B     june    13", header=TRUE)

tmp <- subset(tab, TRUE, select=c(-Time)) # Remove column Time, keep all rows (TRUE)
tmp <- spread(tmp, Test, value)
tmp
##   ID  A  B  C
## 1  1  5  6 NA
## 2  2  7 NA NA
## 3  3  8  9 10
## 4  4 11 NA 12
## 5  5 NA 13 NA

tmp$r1 <- with(tmp, A/B)
tmp$r2 <- with(tmp, A+B)
tmp
##   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

如果缺少计算某个ID的A或B数据,则返回NA。

您可以很好地将原始数据存储在高/整洁的格式中,这样可以轻松地将其转换为比较/聚合/ ...您感兴趣的任何方面。

备注如果您对临时变量感到恼火,可以使用the pipe

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

答案 1 :(得分:1)

与@ 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