簡體   English   中英

基於分組的R中的條件計算

[英]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 )。 以上可以通過循環完成,但我正在尋找更優雅的解決方案。 我已經咨詢了以下主題以獲得指導,但到目前為止還沒有找到解決方案:

根據列中的條件將值分配給組

R根據行創建另一列的列

R中的條件計算基於行值和類別

如果您不太依賴於該特定表格格式,則可以執行以下操作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM