我有一个带有重复ID的数据集,我该如何计算
- 每个ID
的A + B(得到A和B的值的总和)- 每个ID的A / B(计算A / B)
- 将结果包含在数据集中。
醇>
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
答案 0 :(得分:2)
首先,删除列Time
,因为您不需要它,然后将spread
列value
列到多列,让列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