【问题标题】:Calculate new value without converting rows to columns (tidyverse)计算新值而不将行转换为列(tidyverse)
【发布时间】:2020-07-28 19:27:59
【问题描述】:

我有一个数据集,其中包含针对给定位置的许多观测值。每个观察(由具有多列描述符的站点定义)包含一个测量值(也由多列描述符定义)。作为一个精简的例子:

t<-tibble(loc_name=c('A','A', 'B', 'B', 'C', 'C'),
        loc_desc=c('X', 'X', 'Y', 'Y', 'Z', 'Z'),
        qualifier=c(NA, NA, NA, 'U', 'J', NA),
        analyte=rep(c('Clay', 'Silt'),3),
        units=rep('percent',6),
        values=c(0.25, 1, 0.5, 2, 0.75, 3))

  loc_name loc_desc qualifier analyte units   values
  <chr>    <chr>    <chr>     <chr>   <chr>    <dbl>
1 A        X        NA        Clay    percent   0.25
2 A        X        NA        Silt    percent   1   
3 B        Y        NA        Clay    percent   0.5 
4 B        Y        U         Silt    percent   2   
5 C        Z        J         Clay    percent   0.75
6 C        Z        NA        Silt    percent   3  

在此数据中,“loc_name”和“loc_desc”描述了分别收集淤泥和粘土的样本位置。 “qualifier”、“analyte”和“units”都是关于“values”的信息。

我需要做的是计算一个新的分析物值,“细粒”(粘土 + 淤泥)。我会将表格旋转得更宽以使其变得简单,但鉴于列中的信息量,它最终看起来像:

 t %>%
  pivot_wider(names_from=analyte, values_from=values)

  loc_name loc_desc qualifier units    Clay  Silt
  <chr>    <chr>    <chr>     <chr>   <dbl> <dbl>
1 A        X        NA        percent  0.25     1
2 B        Y        NA        percent  0.5     NA
3 B        Y        U         percent NA        2
4 C        Z        J         percent  0.75    NA
5 C        Z        NA        percent NA        3

这并不完全适合计算。

最终结果应如下所示:

  loc_name loc_desc qualifier analyte units   values
  <chr>    <chr>    <chr>     <chr>   <chr>    <dbl>
1 A        X        NA        Clay    percent   0.25
2 A        X        NA        Silt    percent   1   
3 A        X        NA        Fines   percent   1.25
4 B        Y        NA        Clay    percent   0.5 
5 B        Y        U         Silt    percent   2   
6 B        Y        NA        Fines   percent   2.5 
7 C        Z        J         Clay    percent   0.75
8 C        Z        NA        Silt    percent   3   
9 C        Z        NA        Fines   percent   3.75

有没有一种方法可以在不组合所有位置修改列和值修改列的情况下进行此计算?或者如果我必须这样做,有没有办法做到这一点,而不是一团糟(记住我实际上总共有 19 列信息)?我现在唯一的解决方案是制作一个全新的小标题,在其中计算每个样本的“罚款”并将其作为新行附加回来(我认为这应该可行?但它似乎不优雅)。

感谢您的帮助!

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    我们可以通过summarise进行分组,然后将行与原始数据绑定

    library(dplyr)
    t %>% 
       group_by(loc_name, loc_desc, units) %>%
       summarise(analyte = 'Fines', values = sum(values)) %>% 
       bind_rows(t, .) %>%
       arrange(loc_name, loc_desc)
    

    【讨论】:

    • 谢谢!对于其他有同样问题的人,我想添加一个快速说明。在“限定符”的情况下,这工作得很好,因为自动添加的 NA(在绑定行时)是正确的。如果您想要一个非 NA 值,您可以在使用“mutate”进行汇总后立即添加它。例如,如果我希望限定符读取“罚款”的“计算”(因为这是一个计算值):t %&gt;% group_by(loc_name, loc_desc, units) %&gt;% summarise(analyte = 'Fines', values = sum(values)) %&gt;% mutate(qualifier='calc') %&gt;% bind_rows(t, .) %&gt;% arrange(loc_name, loc_desc)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多