[英]Conditional calculations in R based on grouping
數據如下:
df1=data.frame(Date=as.Date(c('8/27/2001','8/27/2001','8/27/2001','11/13/2001','11/13/2001','11/13/2001','8/3/2012','8/3/2012'),format="%m/%d/%Y"),
Name=c('Joe', 'Joe', 'Joe', 'Billy', 'Billy', 'Billy','Emma','Emma'),
Sample=c('Pre','Post','Discard','Pre','Post','Discard','Bone','Pre'),
Cells=c(15,7,3,12,5,2,14,NA))
Date Name Sample Cells
1 2001-08-27 Joe Pre 15
2 2001-08-27 Joe Post 7
3 2001-08-27 Joe Discard 3
4 2001-11-13 Billy Pre 12
5 2001-11-13 Billy Post 5
6 2001-11-13 Billy Discard 2
7 2012-08-03 Emma Bone 14
8 2012-08-03 Emma Pre NA
我想根據日期和名稱的唯一分組添加一個名為“Yield”的計算列(例如條目1-3,4-6或7-8都代表不同的組)。 實際數據可能不完整(參見條目7-8)。
“yield”列應為:
Cells where Sample="Post" divided by Cells where Sample="Pre"
期望的輸出:
Date Name Sample Cells Yield
1 2001-08-27 Joe Pre 15 NA
2 2001-08-27 Joe Post 7 0.46
3 2001-08-27 Joe Discard 3 NA
4 2001-11-13 Billy Pre 12 NA
5 2001-11-13 Billy Post 5 0.41
6 2001-11-13 Billy Discard 2 NA
7 2012-08-03 Emma Bone 14 NA
8 2012-08-03 Emma Pre NA NA
我是R的新手,並希望有效地使用它(例如使用dplyr
)。 以上可以通過循環完成,但我正在尋找更優雅的解決方案。 我已經咨詢了以下主題以獲得指導,但到目前為止還沒有找到解決方案:
如果您不太依賴於該特定表格格式,則可以執行以下操作:
library(dplyr)
library(tidyr)
df1 %>%
spread(Sample, Cells) %>%
mutate(Pre_Post_Yield = Post/Pre)
這將返回一個稍微更人性化的表格:
Date Name Bone Discard Post Pre Pre_Post_Yield
1 2001-08-27 Joe NA 3 7 15 0.4666667
2 2001-11-13 Billy NA 2 5 12 0.4166667
3 2012-08-03 Emma 14 NA NA NA NA
要返回長格式,您可以添加gather(Sample, Cells, Bone:Pre)
。 請注意,結果將與您的示例輸出看起來完全不同,因為R將填充以前不存在的變量組合。 一開始看起來有點奇怪,但你會發現它實際上非常有用,例如因為它使你的缺失數據顯式:
Date Name Pre_Post_Yield Sample Cells
1 2001-08-27 Joe 0.4666667 Bone NA
2 2001-11-13 Billy 0.4166667 Bone NA
3 2012-08-03 Emma NA Bone 14
4 2001-08-27 Joe 0.4666667 Discard 3
5 2001-11-13 Billy 0.4166667 Discard 2
6 2012-08-03 Emma NA Discard NA
7 2001-08-27 Joe 0.4666667 Post 7
8 2001-11-13 Billy 0.4166667 Post 5
9 2012-08-03 Emma NA Post NA
10 2001-08-27 Joe 0.4666667 Pre 15
11 2001-11-13 Billy 0.4166667 Pre 12
12 2012-08-03 Emma NA Pre NA
你可以做:
library(dplyr)
df1 %>%
group_by(Date, Name) %>%
mutate(Yield = ifelse(Sample == "Post", Cells[Sample == "Post"]/Cells[Sample == "Pre"], NA))
# A tibble: 8 x 5
# Groups: Name [3]
Date Name Sample Cells Yield
<date> <fct> <fct> <dbl> <dbl>
1 2001-08-27 Joe Pre 15 NA
2 2001-08-27 Joe Post 7 0.467
3 2001-08-27 Joe Discard 3 NA
4 2001-11-13 Billy Pre 12 NA
5 2001-11-13 Billy Post 5 0.417
6 2001-11-13 Billy Discard 2 NA
7 2012-08-03 Emma Bone 14 NA
8 2012-08-03 Emma Pre NA NA
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.