Вычислить новое значение без преобразования строк в столбцы (tidyverse) - PullRequest
2 голосов
/ 15 апреля 2020

У меня есть набор данных, который имеет много наблюдений для данного местоположения. Каждое наблюдение (определяемое сайтом, имеющим несколько столбцов дескрипторов) содержит измерение (также определяемое несколькими столбцами дескрипторов). В качестве сокращенного примера:

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_des c» описывают местоположение образца, в котором каждый из них собирал ил и глину. «Квалификатор», «аналит» и «единицы измерения» - все это информация о «значениях».

Что мне нужно сделать, так это вычислить новое значение аналита, «Штрафы» (Clay + Silt). Я бы развернул таблицу шире, чтобы сделать это проще, но, учитывая объем информации в столбцах, он выглядит примерно так:

 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 столбцов информации)? Единственное решение, которое у меня есть сейчас, - это сделать новый тиббл, в котором можно рассчитать «штрафы» для каждого образца и прикрепить его обратно в виде новых строк (что, я думаю, должно работать? Но это выглядит не элегантно).

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 15 апреля 2020

Мы можем создать группу по 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)
...